To jest fragment mojego kodu JS, do którego jest to potrzebne:
var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);
Chcę uzyskać datę i godzinę „temu”, ale jeśli czas letni jest używany, daty są przesunięte o 1 godzinę. Nie wiem, jak sprawdzić, czy czas letni obowiązuje, czy nie.
Skąd mogę wiedzieć, kiedy zaczyna się i kończy czas letni?
źródło
getTimezoneOffset
zwraca wartość odwrotną,Math.max
to rzeczywiście zwraca standardowe przesunięcie. Kod jest poprawny.Utwórz dwie daty: jedną w czerwcu, drugą w styczniu. Porównaj ich wartości getTimezoneOffset ().
Teraz sprawdź getTimezoneOffset () aktualnej daty.
źródło
Ta odpowiedź jest dość podobna do zaakceptowanej odpowiedzi, ale nie zastępuje
Date
prototypu i używa tylko jednego wywołania funkcji do sprawdzenia, czy obowiązuje czas letni, a nie dwa.Chodzi o to, że ponieważ żaden kraj nie obserwuje czasu letniego, który trwa 7 miesięcy [1] , na obszarze, na którym obserwuje się czas letni, przesunięcie względem czasu UTC w styczniu będzie inne niż w lipcu.
Podczas gdy czas letni przesuwa zegary do przodu , JavaScript zawsze zwraca większą wartość w czasie standardowym. Dlatego uzyskanie minimalnego przesunięcia między styczniem a lipcem spowoduje przesunięcie strefy czasowej podczas czasu letniego.
Następnie sprawdzamy, czy strefa czasowa dat jest równa tej minimalnej wartości. Jeśli tak, to mamy czas letni; w przeciwnym razie nie jesteśmy.
Poniższa funkcja używa tego algorytmu. Pobiera obiekt daty
d
i zwraca,true
jeśli dla tej daty obowiązuje czas letni, afalse
jeśli nie:źródło
Math.max(...) != d.get...()
, zwróci wartość true, jeśli czas letni jest przestrzegany w danej strefie czasowej ORAZ data jest obecnie w czasie letnim. Jeśli czas letni nie jest przestrzegany lub data odpowiada przesunięciu standardowemu, zwróci wartość fałsz.Miałem dzisiaj ten sam problem, ale ponieważ czas letni zaczyna się i kończy w innym czasie niż w USA (przynajmniej w moim rozumieniu), wybrałem nieco inną trasę.
Następnie wystarczy porównać bieżące przesunięcie strefy czasowej z czasem letnim i innym niż letni, aby zobaczyć, która z nich pasuje.
źródło
Na podstawie komentarza Matta Johansona dotyczącego rozwiązania dostarczonego przez Sheldona Griffina stworzyłem następujący kod:
Stara się uzyskać to, co najlepsze ze wszystkich światów, biorąc pod uwagę wszystkie komentarze i wcześniej sugerowane odpowiedzi, a konkretnie to:
1) Buforuje wynik na rok stdTimezoneOffset, aby nie trzeba było go ponownie obliczać podczas testowania wielu dat w tym samym roku.
2) Nie zakłada, że czas letni (jeśli w ogóle istnieje) przypada koniecznie w lipcu i będzie działał, nawet jeśli w którymś momencie i miejscu będzie w dowolnym miesiącu. Jednak pod względem wydajności będzie działać szybciej, jeśli rzeczywiście lipiec (lub kilka miesięcy) to czas letni.
3) W gorszym przypadku porównuje getTimezoneOffset z pierwszego dnia każdego miesiąca. [i zrób to raz na testowany rok].
Zakłada się, że nadal trwa, jeśli okres czasu letniego jest dłuższy niż jeden miesiąc.
Jeśli ktoś chce usunąć to założenie, może zmienić pętlę w coś bardziej podobnego do tego, co jest w rozwiązaniu dostarczonym przez Aarona Cole'a - ale i tak przeskoczyłbym pół roku do przodu i wyrwałbym się z pętli, gdy zostaną znalezione dwa różne przesunięcia]
źródło
Moment.js biblioteka dostarcza
.isDst()
metody na jego obiektów czasowych.źródło
getTimezoneOffset()
Metoda w JavaScript w przeglądarce, zwraca liczbę minut offsetowych ze strefy 00:00 czasu. Na przykład strefa czasowa America / New_York w czasie letnim (DST) zwraca liczbę 300. 300 minut to 5 godzin różnicy od zera. 300 minut podzielone przez 60 minut to 5 godzin. Każda strefa czasowa jest porównywana z zerową strefą czasową, +00: 00 / Etc / GMT / Greenwich.MDN Web Docs
Następną rzeczą, którą musisz wiedzieć, jest to, że przesunięcie ma znak przeciwny do rzeczywistej strefy czasowej.
Informacje o strefach czasowych są utrzymywane przez Internet Assigned Numbers Authority (IANA)
Iana strefy czasowe
Ładnie sformatowaną tabelę stref czasowych dostarcza joda.org
Strefy czasowe czasu joda
+00: 00 lub Etc / GMT to czas Greenwich
Wszystkie strefy czasowe są przesunięte od +00: 00 / „Etc / GMT” / czasu Greenwich
Czas letni jest zawsze wcześniejszy niż „zwykły” czas letni. Zegary przestawiacie na jesień. (Slogan „Fall Back”, aby pamiętać, co robić)
Tak więc czas America / New_York w czasie letnim (zima) jest jedną godzinę przed regularnym czasem. Na przykład to, co zwykle latem było o 17:00 w Nowym Jorku, to teraz godzina 16:00 czasu Ameryki / Nowego Jorku w czasie letnim. Czas „America / New_York” to nazwa strefy czasowej „Long Format”. Wschodnie wybrzeże Stanów Zjednoczonych zazwyczaj nazywa swoją strefę czasową Wschodnim Czasem Standardowym (EST)
Jeśli chcesz porównać dzisiejsze przesunięcie strefy czasowej z przesunięciem strefy czasowej innej daty, musisz wiedzieć, że znak matematyczny (+/- „dodatnia / ujemna”) przesunięcia strefy czasowej jest przeciwieństwem strefy czasowej.
Spójrz na tabelę stref czasowych na joda.org i znajdź strefę czasową dla „America / New_York”. Przed standardowym przesunięciem będzie oznaczony minus.
Ziemia obraca się przeciwnie do ruchu wskazówek zegara wokół swojej osi. Osoba oglądająca wschód słońca w Greenwich widzi wschód słońca na 5 godzin przed tym, jak ktoś w Nowym Jorku zobaczy wschód słońca. A ktoś na zachodnim wybrzeżu USA zobaczy wschód słońca po tym, jak ktoś na wschodnim wybrzeżu Stanów Zjednoczonych zobaczy wschód słońca.
Jest powód, dla którego musisz to wszystko wiedzieć. Dzięki temu będziesz w stanie logicznie określić, czy jakiś kod JavaScript otrzymuje poprawny stan czasu letniego, czy nie, bez konieczności testowania każdej strefy czasowej o różnych porach roku.
Wyobraź sobie, że w Nowym Jorku jest listopad, a zegary cofnięto o godzinę. Latem w Nowym Jorku przesunięcie to 240 minut lub 4 godziny.
Możesz to sprawdzić, tworząc datę przypadającą na lipiec, a następnie uzyskując przesunięcie.
Co zostanie wydrukowane w dzienniku konsoli narzędzi programistycznych przeglądarki?
Odpowiedź brzmi: 240
Więc teraz możesz utworzyć datę w styczniu i zobaczyć, co zwraca Twoja przeglądarka dla przesunięcia strefy czasowej na sezon zimowy.
Odpowiedź brzmi: 300
Oczywiście 300 to więcej niż 240. Więc co to oznacza? Czy powinieneś napisać kod sprawdzający, czy przesunięcie zimowe jest większe niż przesunięcie letnie? A może lato mniej niż zimowe? Jeśli istnieje różnica między przesunięciem letniej i zimowej strefy czasowej, można założyć, że w tej strefie czasowej używany jest czas letni. Ale to nie mówi ci, czy dzisiaj używa się czasu letniego dla strefy czasowej przeglądarek. Musisz więc pobrać dzisiejsze przesunięcie strefy czasowej.
Odpowiedź to: ? - Zależy od pory roku
Jeśli przesunięcie dzisiejszej strefy czasowej i przesunięcie strefy czasowej letniej jest takie samo, ORAZ przesunięcie strefy czasowej letniej i zimowej jest różne, to zgodnie z logiczną dedukcją dzisiejszy dzień NIE może być czasem letnim.
Czy możesz pominąć porównanie przesunięć strefy czasowej letniej i zimowej (aby wiedzieć, czy czas letni jest używany w tej strefie czasowej) i po prostu porównać przesunięcie dzisiejszej strefy czasowej z przesunięciem letniego czasu TZ i zawsze uzyskać poprawną odpowiedź?
Cóż, dziś zimą czy latem? Gdybyś to wiedział, mógłbyś zastosować następującą logikę:
Problem w tym, że nie wiadomo, czy dzisiejsza data jest zimą czy latem. Każda strefa czasowa może mieć własne zasady dotyczące rozpoczęcia i zakończenia czasu letniego. Musisz śledzić zasady każdej strefy czasowej dla każdej strefy czasowej na świecie. Tak więc, jeśli istnieje lepszy i łatwiejszy sposób, równie dobrze możesz to zrobić w lepszy i łatwiejszy sposób.
Pozostaje nam tylko to, że musisz wiedzieć, czy ta strefa czasowa używa czasu letniego, a następnie porównać dzisiejsze przesunięcie strefy czasowej z przesunięciem strefy czasowej letniej. To zawsze da ci wiarygodną odpowiedź.
Ostateczna logika to:
Funkcja określająca, czy strefa czasowa w przeglądarce używa czasu letniego:
źródło
Użyj Moment.js ( https://momentjs.com/ )
moment().isDST();
poda, jeśli obserwuje się oszczędność światła dziennego.Posiada również funkcję pomocniczą do obliczania czasu względnego. Nie musisz wykonywać ręcznych obliczeń np
moment("20200105", "YYYYMMDD").fromNow();
źródło
Jesteś blisko, ale trochę daleko. Nigdy nie musisz obliczać własnego czasu, ponieważ jest on wynikiem twojego własnego zegara. Może wykryć, czy korzystasz z czasu letniego w Twojej lokalizacji, ale nie w odległej lokalizacji wynikającej z przesunięcia:
To nadal będzie błędne i wyłączone o godzinę, jeśli są w czasie letnim. Potrzebujesz konta czasu zdalnego, jeśli obecnie znajdują się w swoim czasie letnim lub nie, i odpowiednio dostosuj. spróbuj to obliczyć i zmień zegar na - powiedzmy 01.02.2015 i cofnij zegar o godzinę, jakby był poza czasem letnim. Następnie oblicz przesunięcie dla miejsca, które powinno być jeszcze 2 godziny za. Pokaże się godzinę przed dwugodzinnym oknem. Nadal musiałbyś liczyć się z godziną i dostosować. Zrobiłem to dla NY i Denver i zawsze idę niepoprawnie (godzinę do przodu) w Denver.
źródło
Zauważyłem, że korzystanie z biblioteki Moment.js z niektórymi opisanymi tu koncepcjami (porównanie stycznia do czerwca) działa bardzo dobrze.
Ta prosta funkcja zwraca, czy strefa czasowa, w której znajduje się użytkownik, przestrzega czasu letniego:
Prostym sposobem sprawdzenia, czy to działa (w systemie Windows), jest zmiana strefy czasowej na strefę inną niż DST, na przykład Arizona zwróci wartość false, a EST lub PST zwróci true.
źródło
Przyszłościowe rozwiązanie, które działa we wszystkich strefach czasowych
x
będzie spodziewaną liczbą milisekund do roku będącego przedmiotem zainteresowania bez uwzględnienia czasu letniego.y
być liczba milisekund od epoki od początku roku do dnia zainteresowania.z
będzie liczbą milisekund, które upłynęły od epoki pełnej interesującej daty i godzinyt
będzie odejmowanie zarównox
iy
zez
:z - y - x
. Daje to przesunięcie wynikające z czasu letniego.t
wynosi zero, czas letni nie obowiązuje. Jeślit
nie jest zerem, obowiązuje czas letni.Uważam, że powyższy fragment kodu jest lepszy od wszystkich innych odpowiedzi zamieszczonych tutaj z wielu powodów.
Jeśli jednak nie przygotowujesz się na więcej niż 2 okresy czasu letniego, poniższy kod może posłużyć do określenia, czy czas letni obowiązuje jako wartość logiczna.
źródło
Niedawno musiałem utworzyć ciąg daty z UTC i DST i na podstawie odpowiedzi Sheldona złożyłem to razem:
źródło
Czy jest problem z używaniem
Date.toString().indexOf('Daylight Time') > -1
"" + new Date()
"" + new Date(...)
Wydaje się, że jest to zgodne ze wszystkimi przeglądarkami.
źródło
"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
Styl ES6
źródło