2010-10-07 12 views
5

Mam kawałek zoptymalizowanej funkcji, aby uzyskać czas GMT. Chciałbym przekonwertować go na czas lokalny. Chciałbym zadzwonić do funkcji czasu lokalnego i gmtime tylko raz, aby dostosować czas do czasu lokalnego, ponieważ wywoływanie czasu lokalnego i gmtime wiele razy pokonałoby cel używania zoptymalizowanej funkcji. Mój pomysł polega na dodaniu różnicy w strefie czasowej do uzyskanego czasu GMT. Jednak mój problem polega na tym, w jaki sposób mogę skorygować czas lokalny, gdy jest dostępna zmiana czasu? Jakieś pomysły na sprawdzenie tego?Dostosuj czas letni do czasu lokalnego C++

Dzięki.

Odpowiedz

0

Można pracować bezpośrednio z bazą danych strefy czasowej, ale być może nie chcesz wprowadzić innego komponentu.

Gdybym podążał za twoim pomysłem, zapisałbym różnice czasowe na tydzień lub dzień wcześniej i używałam ich później. Jest to trochę brudne, ponieważ stracisz dokładny czas przełączników DST. Aby uzyskać najlepszą dokładność, można teoretycznie użyć wyszukiwania binarnego w czasie lokalnym, ale wydaje się to zbyteczne w porównaniu do bezpośredniego korzystania z bazy danych strefy czasowej, a to, do czego dojdziemy, jest w efekcie wejściem do strefy strefy czasowej strefy czasowej.

+0

Komenda 'zdump -v ' zrzuca dane strefy czasowej dla wybranej strefy w formie czytelnej dla człowieka. Przetwarzałbym to przy uruchomieniu programu, a nie odtwarzałem go za pomocą wyszukiwania binarnego. A może po prostu odczytałbym plik danych strefy czasowej bezpośrednio: jego format jest udokumentowany w 'man tzfile'. –

1

Możesz użyć bazy danych TZ, która jest przechowywana przez większość czasu w/usr/share/lib/zoneinfo w większości dystrybucji Linuksa. Ta baza danych zarządza zmianami czasu, więc nie musisz tego robić.

0

Moja aplikacja wymaga uzyskania lokalnego czasu standardowego (w lokalnej strefie czasowej, ale nie jest dostosowywana do czasu letniego). Nie jestem pewien, czy to jest dokładnie to, czego chcesz, ale uważam, że problem jest podobny. W ten sposób sam to osiągam. Wiem, że jest przenośny między Windows i 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

Możesz wywołać tzset(), a następnie sprawdzić wartość _dekonto.

Powiązane problemy