2012-10-03 4 views
5

Zauważyłem coś dziwnego z strefami czasowymi i obiektem JavaScript Date.Czy istnieje sposób reprezentowania 21 października 2012 r. W obiekcie JavaScript "Date"?

Trying to na Linuksie:

$ TZ='America/Sao_Paulo' js 
js> new Date(2012, 9, 21, 0, 0, 0).toString() 
"Sat Oct 20 2012 23:00:00 GMT-0300 (BRST)" 

znalazłem to niemożliwe, aby uzyskać obiekt, który reprezentuje 21th of October 2012. Każdy próbami, aby uzyskać Date między 00:00 a 01:00 tego samego dnia daje datę w dniu poprzedzającym od 23:00 do 00:00.

(użytkownik Windows może zmienić swoją strefę czasową Brasilia/GMT-03 doświadczyć samo zachowanie)

Dodawanie jedną godzinę (lub jeden dzień) do takiego wyników data obiektów w powrocie tę samą datę.

Przypuszczam, że ma to związek z czasem letnim, który ma miejsce w tym dniu w Brazylii, ale absolutnie nie wiem, jak sobie z tym poradzić.

Mam pętlę, która iteruje dni miesiąca (dla aplikacji kalendarza) i oczywiście pętle na zawsze w takim przypadku po osiągnięciu 20 października 2012.

Musi być coś robię źle, ale nie wiem, jak sobie z tym poradzić, jak sądzę, że może się to zdarzyć również w innych strefach czasowych.

Jaki jest zalecany sposób postępowania z Date w Javascript, aby upewnić się, że takie problemy związane z czasem strefy czasowej/zmianą czasu nie występują?

Odpowiedz

0

To jest absolutnie poprawne zachowanie. Ze względu na północ DST po prostu nie ma czasu lokalnego w Brazylii, 21 października. Jeśli potrzebujesz tylko zbudować kalendarz, możesz po prostu użyć new Date(2012, 9, 21, 0, 0, 0).toUTCString() zamiast new Date(2012, 9, 21, 0, 0, 0).toString() i innych UTC methods.

Na przykład, aby utworzyć datę UTC, można użyć new Date(Date.UTC(2012, 9, 21, 0, 0, 0));.

+0

Dzięki za odpowiedź. Jednak moim problemem nie jest uzyskanie reprezentacji ciągów daty, ale uzyskanie poprawnego obiektu, który reprezentuje ten dokładny moment. – ereOn

+1

Następnie wystarczy użyć metody UTC: 'new Date (Date.UTC (2012, 9, 21, 0, 0, 0));' – bjornd

+0

To rzeczywiście działa lepiej. Czy mógłbyś edytować odpowiedź, aby było bardziej oczywiste, jakie jest prawdziwe rozwiązanie? Chętnie to zaakceptuję :) – ereOn

Powiązane problemy