2010-10-07 20 views
5

Ho una funzione ottimizzata per ottenere l'ora GMT. Vorrei convertirlo all'ora locale. Vorrei richiamare la funzione localtime e gmtime una volta sola per regolare l'ora locale, in quanto chiamare localtime e gmtime più volte annullerebbero lo scopo dell'utilizzo della funzione ottimizzata. La mia idea è di aggiungere la differenza di fuso orario all'ora GMT che ho ottenuto. Tuttavia, il mio problema è come posso regolare il mio locale quando c'è l'ora legale? Qualche idea su come controllarlo?Regola ora all'ora legale per ora locale C++

Grazie.

risposta

0

Si potrebbe lavorare direttamente con un database di fuso orario ma forse non ti piace introdurre un altro componente.

Se avessi seguito la tua idea, avrei memorizzato le differenze di orario alla settimana o al giorno in anticipo e le userei in seguito. Questo è un po 'sporco perché perderai l'ora esatta degli switch dell'ora legale. Per la massima precisione si potrebbe in teoria utilizzare una ricerca binaria in locale, ma ciò sembra eccessivo rispetto all'uso diretto di un database dei fusi orari e ciò che si arriva qui è in effetti una voce del database delle zone del fuso orario per il proprio fuso orario.

+0

Il comando 'zdump -v ' scarica i dati del fuso orario per la zona selezionata in forma leggibile dall'uomo. Lo analizzerei all'avvio del programma piuttosto che ricostruirlo con la ricerca binaria. O forse vorrei solo leggere il file di dati del fuso orario direttamente: il suo formato è documentato in 'man tzfile'. –

1

È possibile utilizzare il database TZ che viene memorizzato la maggior parte del tempo in/usr/share/lib/zoneinfo nella maggior parte delle distribuzioni Linux. Questo database gestisce l'ora legale in modo da non doverlo affrontare.

0

La mia domanda ha bisogno di ottenere l'ora locale locale (nel fuso orario locale ma non regolata per l'ora legale). Non sono sicuro se questo è esattamente ciò che vuoi ma credo che il problema sia simile. Questo è il modo in cui realizzo me stesso. So che è portatile tra windows e linux:

LgrDate rtn = local(); 
    int8 adjustment = 0;; 
#ifdef _WIN32 
    TIME_ZONE_INFORMATION zone_info; 
    uint4 rcd; 

    rcd = GetTimeZoneInformation(&zone_info); 
    if(rcd == TIME_ZONE_ID_DAYLIGHT) 
    adjustment = zone_info.DaylightBias*nsecPerMin; 
#else 
    // there is no portable means of obtaining the daylight savings time bias directly. We can, 
    // however, obtain the local time, and, if daylight savings time is enabled, we can use mktime 
    // to find out what the bias would be. 
    struct timeval time_of_day; 
    struct tm local_tm; 

    gettimeofday(&time_of_day,0); 
    localtime_r(
    &time_of_day.tv_sec, 
    &local_tm); 
    if(local_tm.tm_isdst > 0) 
    { 
    local_tm.tm_isdst = 0; 
    adjustment = (mktime(&local_tm) - time_of_day.tv_sec) * nsecPerSec * -1; 
    } 
#endif 
    return rtn + adjustment; 
0

È possibile chiamare tzset() e quindi controllare il valore _daylight.