2013-02-08 7 views
5

Po pierwsze, NIE szukam, czy DST działa lokalnie.JavaScript Data - jak sprawdzić, czy DST obowiązuje w danej strefie czasowej

Uruchamiam proces węzła, który zawiera dane powiązane z sygnaturami czasowymi. Muszę przekonwertować te znaczniki czasu na dzień/miesiąc/rok w określonej strefie czasowej, ale wszystko, co mam, to przesunięcie strefy czasowej i przesunięcie czasu letniego.

Chciałbym, aby data/moment działały lepiej ze strefami czasowymi. Działają wspaniale z UTC lub lokalnymi strefami czasowymi, ale wydaje się, że musisz zhakować je, aby uzyskać coś innego.

Czy jest coś, czego mi brakuje? Zakładając, że mogę określić, czy strefa czasowa jest w istocie, to ta praca:

var d = new Date(ts + timezone_offset - local_offset); 
d.getMonth(); 
d.getDate(); 

gdzie timezone_offset jest strefa czasowa jest przesunięcie (albo standard offsetu lub DST jeden)?

W jaki sposób mogę ustalić, czy DST obowiązuje?

+0

jest to duplikat: http://stackoverflow.com/questions/4903722/working-with-timezones-and-daylight-savings-time- in-javascript? rq = 1 – kmote

+0

to jest całkiem proste, wystarczy wykonać kilka porównań dat, zobacz moje repo tutaj dla rozszerzonego przykładu: https://github.com/jthoburn/Date.toString.js – runspired

+0

w szczególności spójrz na kod dla ' I 'i zmodyfikuj go, aby użyć tej metody: http://stackoverflow.com/a/14636431/1883464 – runspired

Odpowiedz

0

Czy jest coś, czego mi brakuje? Zakładając, że mogę określić, czy DST działa, czy to zadziała, gdzie timezone_offset jest przesunięciem strefy czasowej żądanej?

Staraj się zawsze używać metod UTC do uzyskania atrybutów dat. W ten sposób lokalna strefa czasowa (serwer) nie wpłynie żadnych obliczeń:

var d = new Date(ts + timezone_offset); 
d.getUTCMonth(); 
d.getUTCDate(); 

Jak mogę określić, czy strefa czasowa jest w rzeczywistości?

To skomplikowane. Istnieje/było wiele różnych algorytmów określających początek i koniec DST, w zależności od regionu - na przykład spójrz na http://en.wikipedia.org/wiki/Daylight_saving_time_by_country.

Nie wiem, czy istnieją jakieś biblioteki, które już je zakodowały, a może nawet kontaktują się z timezone database w celu uzyskania poprawnych informacji. Ostatnim rozwiązaniem byłoby zapytanie użytkownika o szczegóły strefy czasowej.

0

moment.js (http://momentjs.com/) ma funkcję isDST. Możesz użyć momentu (dużo prostszego) lub sprawdzić, w jaki sposób jest on implementowany.

moment(your_date).isDST(); 
+2

To zadziała tylko wtedy, gdy sprawdzasz, czy data jest w strefie czasowej * w strefie * lokalnej *. Nie w jakiejś innej arbitralnej strefie. –

2

pierwsze, uznają, że jeśli wszystko masz to offsety, nie można rozwiązać ten problem. Musisz mieć identyfikator strefy czasowej, taki jak "America/New_York". Ponieważ w pytaniach, które powiedziałeś, że rzeczywiście masz to, możesz użyć one of these libraries, aby wykonać zadanie.

Wcześniej wysłałem kolejną odpowiedź na to pytanie, zalecając TimeZoneJS, ale wycofam to teraz - ponieważ to pytanie dotyczy DST, a TimeZoneJS zawiera błędy, nieprawidłowo raportujące wartości w pobliżu przejść DST.

Zamiast tego, teraz polecam używanie moment.js z dodatkiem moment-timezone.Po zainstalowaniu obu bibliotek (jest pewny, aby załadować dane rzeczywiste strefie czasowej, za docs), kod jest dość prosta:

moment(timestamp).tz(timezone).isDST() 

Na przykład:

moment(1451624400000).tz('America/New_York').isDST(); // false 
moment(1467345600000).tz('America/New_York').isDST(); // true 

Albo, jeśli znaczniki czasu są już ciągi pod względem czasu lokalnego, a następnie użyć tej składni zamiast:

moment.tz('2016-01-01T00:00:00','America/New_York').isDST(); // false 
moment.tz('2016-07-01T00:00:00','America/New_York').isDST(); // true 
+0

Czy ta biblioteka używa obiektu Date jako serwera proxy pod maską, takiego jak timezoneJS? A może wdrożyli wszystko od zera? – matf

+0

Moment sam obecnie używa obiektu 'Date' dla niektórych rzeczy, ale bierze pod uwagę wszystkie różne dziwactwa. Nadal mamy [otwarty element] (https://github.com/moment/moment/issues/2617), aby rozważyć jego usunięcie. Moment-timezone realizuje wszystko od zera w odniesieniu do stref czasowych. Nie polega na tym, aby obiekt Date wykonywał konwersje strefy czasowej. –

+0

Testowałem przypadki, w których timezoneJS zawiedzie i działają poprawnie w strefie czasowej. – matf

Powiązane problemy