2012-05-10 9 views
7

Mam następujące wątpliwości dotyczące użycia flagi tm_isdst w strukturze TM. Zgodnie strony człowieka i googled wyniki, to rozumieć, że jego wartość jest interpretowany w następujący sposóbmktime i tm_isdst flag

A. Wartość 0 wskazuje DST nie jest w rzeczywistości do czasu reprezentowanego

B. wartość 1 oznacza DST w efekcie:

C. Wartość -1 powoduje, że mktime sprawdza, czy DST działa, czy też nie.

To jest ten trzeci punkt, który mnie myli. Mam wątpliwości, w jaki sposób mktime może ustalić, czy DST musi być stosowane, czy nie.

Na przykład

My Time Zone = GMT + 3:00 
DST shifting = +1 Hour at 5:00 AM in January (to keep it simple) 
Current UTC time = "01/Jan/2012 00:00:00" 
UTC time in seconds time_t timetUTC = X seconds 
Hence my time is = "01/Jan/2012 03:00:00" 

miarę upływu czasu moje zmiany wartości pieniądza w czasie następująco

"01/Jan/2012 04:00:00"   (X + 1 * 60 * 60) 
"01/Jan/2012 05:00:00"   (X + 2 * 60 * 60) 
"01/Jan/2012 05:59:59"   (X + 2 * 60 * 60 + 59) 
"01/Jan/2012 05:00:00"   (X + 3 * 60 * 60) 
"01/Jan/2012 06:00:00"   (X + 4 * 60 * 60) 

zgodnie z moim rozumieniem

tm tmMyTime = localtime_r(X + 2 * 60 * 60) will set tmMyTime.tm_isdst to 0 
tm tmMyTime = localtime_r(X + 3 * 60 * 60) will set tmMyTime.tm_isdst to 1 

ten sposób, mimo wszystkich innych komponentów w obu przypadkach struktura jest równa, mktime (tmMyTime) może zwrócić p roper Wartość UTC, w zależności od wartości tm_isdst.

Teraz, jeśli ustawię tmMyTime.tm_isdst = -1, jaką wartość zwróci mktime? Czytałem o zmiennej TZ, bazie danych czasu itp. Itd. Mimo wszystko logicznie w jaki sposób mktime() może dowiedzieć się, czy zastosować korektę DST, czy nie dla tych wartości tm, które mogą wystąpić dwa razy?

Nie mamy czasu letniego w naszej strefie czasowej. Dlatego nie jestem pewien, czy moje zrozumienie jest poprawne. Proszę, popraw mnie jeśli się mylę. Twoja pomoc jest bardzo ceniona.

+4

Odkryłeś, że czas lokalny jest niejednoznaczny. To jest. –

Odpowiedz

4

W skrócie: zależy od wdrożenia.

mktime zna zasady DST, sprawdzając ustawienia narodowe.

Przez większą część roku mktime może określić, czy DST ma obowiązywać dla określonego czasu lokalnego. Problemem jest rzeczywiście "zduplikowana" godzina, kiedy DST przesuwa się w tył (w twoim przykładzie 05:00:00 - 05:59:59). W tym lokalnym przedziale czasowym, podanym tm_isdst = -1, mktime nie może wiedzieć, czy DST działa, czy nie. Który z nich jest wybrany, różni się od jednej implementacji do drugiej. Przy wersji mktime wersji GNU zwracany jest czas UTC przed przesunięciem.

+1

Dzięki Pat. W najlepszym razie mktime może robić tylko tyle, co czułem. Ale nigdzie (w tym strony man) nie było wyraźnego opisu dotyczącego obchodzenia się z tą niejednoznaczną 1 godziną. Byłem bardziej zdezorientowany zauważając celowe resetowanie tej flagi do -1 w naszej bazie kodu za każdym razem po "tm = localtime_r (time_t)". Przynajmniej w tym przypadku pomyślałem, że flaga powinna pozostać nietknięta. Ponadto uważam, że implementacje powinny jasno określać to zachowanie na stronie podręcznika. Zarówno standardowa funkcja powinna dawać zawsze poprawny wynik lub błąd rzutu w przypadku niepowodzenia, lub przynajmniej wspomnieć o odchyleniach na stronie podręcznika. – mpathi

+0

Dobra odpowiedź. Problem polega na tym, że jeśli użytkownik przekazuje nam coś podobnego do 'struct tm', a naszym jedynym interfejsem do informacji o strefie czasowej jest Posix' mktime() ', to nie możemy też samodzielnie kodować wokół problemu. Albo możemy zmusić użytkownika do określenia, które "3 listopada 2013 o 1:30:00 AM" dają nam, albo możemy równie dobrze ustawić 'tm_isdst = -1' i mieć nadzieję na najlepsze. –

1

Myślę, że to będzie nieco zależne od twojej platformy. W systemie Windows dokumentacja mktime() stwierdza, że ​​"biblioteka czasu wykonywania C przyjmuje zasady obowiązujące w Stanach Zjednoczonych w zakresie wykonywania obliczeń czasu letniego", więc ma tabelę reguł gdzieś, gdzie może określić, kiedy DST się zaczęło/zakończył się w danym roku.

Masz szczęście, że nie masz czasu letniego tam, gdzie jesteś. W moim świecie, jakim jest pozyskiwanie i prezentacja danych w czasie rzeczywistym, DST jest wielką uciążliwością!

+0

Dzięki za odpowiedź. Jednak wciąż nie jest jasne, w jaki sposób mktime() może to zrobić. Ponieważ dwie wartości UTC time_t mogą mieć tę samą wartość tm w lokalnej strefie czasowej (z wyjątkiem is_dst), i jeśli zresetuję tę flagę do -1, funkcja logiczna mktime() nie ma żadnej wskazówki, która z wartości UTC powinna przekonwertuj z powrotem na. – mpathi

1

tm_isdst nie może ogólnie rozwiązać niejednoznacznych czasów. Dzieje się tak dlatego, że wiele stref czasowych ma przejścia (jednorazowe) bez przeskakiwania z dst do nodst, zmieniając tylko przesunięcie i skrót strefy. Tak więc oba razy (przed i po przejściu) mają ten sam tm_isdst. Niektóre inne strefy zmieniają się tm_isdst podczas przełączania czasu letniego/zimowego, ale nie zmieniają skrótu (np. Australia/Melbourne).