2016-06-12 23 views
-1

Umgebung: Ubuntu 14.04.Konvertieren von GMT zu lokalen Ergebnissen in einem Jahr Unterschied

Ich versuche, in struct tm aufgeschlüsselt Zeit in GMT angegeben zu speichern. Hier ist meine C++ Funktion:

void mygmt(int year, int month, int day, int hour, int minute, int second) { 
    struct tm gmtTime; 

    memset(&gmtTime, 0, sizeof(struct tm)); 

    gmtTime.tm_mday = day; 
    gmtTime.tm_mon = month - 1; // 0-based 
    gmtTime.tm_year = year - 1900; 
    gmtTime.tm_hour = hour; 
    gmtTime.tm_min = minute; 
    gmtTime.tm_sec = second; 
    gmtTime.tm_zone = "GMT"; 

    char buffer [80]; 
    strftime (buffer,80,"GMT time: %b %d, %G %I:%M:%S %p %Z.", &gmtTime); 
    puts(buffer); 

    time_t rawtime = timegm(&gmtTime); 
    struct tm* timeinfo = localtime (&rawtime); 
    strftime (buffer,80,"Local time: %b %d, %G %I:%M:%S %p %Z.",timeinfo); 
    puts(buffer); 
} 

Hier ist, wie ich es nenne:

// June 11, 2016 23:34:03 (in GMT) 
mygmt(2016, 6, 11, 23, 34, 3); 

Und hier ist der Ausgang:

GMT time: Jun 11, 2015 11:34:03 PM GMT. 
Local time: Jun 11, 2016 04:34:03 PM PDT. 

ich Ortszeit erwarten -7 Stunden um von GMT und dieser Teil der Ausgabe scheint richtig zu sein. Was mich verwirrt, ist die Ausgabe für die GMT-Zeit. Es zeigt mir einen Unterschied von einem Jahr von dem Wert, den ich angegeben habe. Wie repariere ich es?

+0

C ist nicht C++ ist nicht C. Wenn Sie als C++ kompilieren, spammen Sie keine Tags. – Olaf

Antwort

2

strftime, rufen timegm auf Null zu füllen tm -Felder eingestellt Vor dem Aufruf:

// ... 

time_t rawtime = timegm(&gmtTime); 

char buffer [80]; 
strftime (buffer,80,"GMT time: %b %d, %G %I:%M:%S %p %Z.", &gmtTime); 
puts(buffer); 

struct tm* timeinfo = localtime (&rawtime); 
strftime (buffer,80,"Local time: %b %d, %G %I:%M:%S %p %Z.",timeinfo); 

// ... 

Hinweis: Sie könnten% Y anstelle von% G (das ist ein wenig kompliziert ist) in Betracht ziehen.

Siehe auch: std::mktime and timezone info und Easy way to convert a struct tm (expressed in UTC) to time_t type.

+0

Das hat es getan. Vielen Dank für Ihre Hilfe. – Peter