Sto vivendo un bizzarro problema in cui il mio orologio di sistema sa che è l'ora legale, ma sembra che glibc non lo faccia. Questa è un'installazione di Ubuntu aggiornata, e ho controllato/etc/localtime e ha il tempo di passaggio corretto per il passaggio alla DST della scorsa settimana.Perché il "fuso orario" di glibc non è d'accordo con l'ora del sistema su DST?
L'ora corrente corretta per me è Pacific Daylight Time (UTC-7). Quando chiedo il mio sistema quello fuso orario mi trovo, mi dice correttamente:
$ date +%z
-0700
Ma quando ho eseguito il seguente programma:
#include <time.h>
#include <stdio.h>
int main() {
tzset();
printf("%lu\n", timezone);
return 0;
}
L'uscita è, in modo non corretto:
28800
Che corrisponde a UTC-8 o all'ora solare del Pacifico. (E no, TZ non è impostato nel mio ambiente)
Ho pensato che glibc e il programma di data avrebbero ottenuto le informazioni sul fuso orario dalla stessa sorgente, ma a quanto pare non lo fanno o sto fraintendendo il fuso orario di glibc opere globali.
Le domande fondamentali sono quindi:
- Perché questi due uscite differenti
- Come posso affidabile rilevare l'offset da un programma C UTC sistema?
La mia lettura della pagina di manuale per tzset indica che la variabile diurna indica solo se la zona locale utilizza l'ora legale a un certo punto e non indica necessariamente se è attualmente in vigore. –
Penso di essere d'accordo con te. Suggerirei {time_t t = time (NULL); printf ("% d \ n", (int) difftime (mktime (gmtime (& t)), t)); } ma questo mi dà lo stesso risultato di "timezone". –