2017-11-10 3 views
0

Sowohl ftime als auch gettimeofday geben 0 für die aktuelle Zeitzone in Ubuntu 16 zurück. Die Zeitzone ist in den von Ubuntu bereitgestellten Einstellungen für Datum und Uhrzeit richtig eingestellt. Es ist keine TZ env-Variable festgelegt.Warum ist die Zeitzone des Tages falsch?

Ich möchte nicht nur "reparieren", weil dies Produktionssoftware in vielen verschiedenen Kontexten verwendet wird. Daher möchte ich nur eine zuverlässige Möglichkeit, die Zeitzone programmatisch zu erhalten (und vorzugsweise auch den aktuellen DST-Offset).

Meine Versuche bisher:

#if 0 
timeb tbTime; 
ftime(&tbTime); 
int CurTz = -tbTime.timezone; 
#else 
struct timeval tv; 
struct timezone tz; 
int r = gettimeofday(&tv, &tz); 
if (r) 
    return NO_ZONE; 

int CurTz = tz.tz_minuteswest; 
#endif 

Der ‚date‘ Befehl funktioniert:

[email protected]:~$ date +%Z 
AEDT 
[email protected]:~$ date +%z 
+1100 

ich nur könnte einen Prozess erzeugen „date“ zu nennen, aber das scheint sehr plump, wenn Einige API-Aufrufe sind verfügbar.

+0

Das funktioniert für mich richtig (kein TZ env definiert auch). Getestet auf OSX. –

+0

Wahrscheinlich, weil verschiedene Systeme unterschiedliche Einstellungen haben. Dieser Code funktioniert beispielsweise unter Windows einwandfrei. Und vielleicht ist mein Ubuntu irgendwie kaputt? Aber ich muss es auf ähnlichen "busted" -Systemen draußen auf dem Gebiet arbeiten lassen. – fret

Antwort

1

Unter GNU/Linux ist das zweite Argument von gettimeofday ziemlich nutzlos und sollte immer NULL sein. Die manual page for gettimeofday sagt dies:

Die Verwendung der Zeitzone Struktur ist veraltet; Das tz Argument sollte normalerweise als NULL angegeben werden.

Auch auf Nicht-Linux-Systemen hat die tz_dsttime nutzlos Semantik (zum Beispiel es berichtet, dass Indien DST verwendet, weil es vor so für eine kurze Zeit über 70 Jahre getan hat).

Wenn Sie die Zeitzone für die aktuelle Zeit erhalten müssen, müssen Sie localtime oder localtime_r und untersuchen Sie die kaputte Zeitstruktur verwenden, es (und nicht globale Variablen wie daylight) erzeugt. Die struct tm Mitglieder, die Sie wahrscheinlich interessieren, sind tm_isdst, tm_gmtoff und vielleicht tm_zone. Die letzten beiden sind Glibc-Erweiterungen.

+0

Ok, ich kann immer noch nicht, was ich von Localtime will. Gibt es eine API, um die Informationen zu erhalten, die der Befehl "date" zurückgibt? – fret

+0

Sie können 'localtime' oder' localtime_r' verwenden. Ich habe meine Antwort geklärt. –