Mam datę i godzinę w określonej strefie czasowej jako ciąg i chcę ją przekonwertować na czas lokalny. Ale nie wiem, jak ustawić strefę czasową w obiekcie Date.
Na przykład mam Feb 28 2013 7:00 PM ET,
wtedy mogę
var mydate = new Date();
mydate.setFullYear(2013);
mydate.setMonth(02);
mydate.setDate(28);
mydate.setHours(7);
mydate.setMinutes(00);
O ile mi wiadomo, mogę ustawić czas UTC lub czas lokalny. Ale jak ustawić czas w innej strefie czasowej?
Próbowałem użyć dodawania / odejmowania przesunięcia od UTC, ale nie wiem, jak przeciwdziałać oszczędnościom światła dziennego. Nie jestem pewien, czy zmierzam we właściwym kierunku.
Jak mogę konwertować czas z innej strefy czasowej na czas lokalny w javascript?
javascript
timezone
pavanred
źródło
źródło
Odpowiedzi:
tło
Date
Obiekt JavaScript wewnętrznie śledzi czas w UTC, ale zazwyczaj przyjmuje dane wejściowe i generuje dane wyjściowe w czasie lokalnym komputera, na którym działa. Ma bardzo mało możliwości pracy z czasem w innych strefach czasowych.Wewnętrzna reprezentacja
Date
obiektu jest pojedynczą liczbą, reprezentującą liczbę milisekund, które upłynęły od tego czasu1970-01-01 00:00:00 UTC
, bez względu na sekundy przestępne. W samym obiekcie Date nie ma strefy czasowej ani formatu łańcucha. GdyDate
używane są różne funkcje obiektu, lokalna strefa czasowa komputera jest stosowana do wewnętrznej reprezentacji. Jeśli funkcja generuje ciąg, wówczas informacje o lokalizacji komputera mogą być brane pod uwagę w celu ustalenia, jak wygenerować ten ciąg. Szczegóły różnią się w zależności od funkcji, a niektóre dotyczą konkretnej implementacji.Jedyne operacje, które
Date
obiekt może wykonać w nielokalnych strefach czasowych to:Może analizować ciąg zawierający numeryczne przesunięcie UTC z dowolnej strefy czasowej. Wykorzystuje to do dostosowania analizowanej wartości i zapisuje ekwiwalent UTC. Pierwotny czas lokalny i przesunięcie nie są zachowywane w wynikowym
Date
obiekcie. Na przykład:W środowiskach, w których zaimplementowano interfejs API internacjonalizacji ECMASCript (znany również jako „Intl”),
Date
obiekt może wygenerować ciąg specyficzny dla ustawień regionalnych dostosowany do danego identyfikatora strefy czasowej. Dokonuje się tego poprzeztimeZone
opcjętoLocaleString
i jej odmiany. Większość implementacji obsługuje identyfikatory stref czasowych IANA, takie jak'America/New_York'
. Na przykład:Większość współczesnych środowisk obsługuje pełny zestaw identyfikatorów stref czasowych IANA ( patrz tabela kompatybilności tutaj ). Należy jednak pamiętać, że jedynym identyfikatorem wymaganym do obsługi przez Intl jest
'UTC'
, dlatego należy dokładnie sprawdzić, czy trzeba obsługiwać starsze przeglądarki lub nietypowe środowiska (na przykład lekkie urządzenia IoT).Biblioteki
Istnieje kilka bibliotek, których można używać do pracy ze strefami czasowymi. Chociaż nadal nie mogą sprawić, by
Date
obiekt zachowywał się inaczej, zazwyczaj implementują standardową bazę danych stref czasowych IANA i zapewniają funkcje umożliwiające korzystanie z niej w JavaScript. Nowoczesne biblioteki używają danych strefy czasowej dostarczonych przez Intl API, ale starsze biblioteki zwykle mają narzuty, szczególnie jeśli pracujesz w przeglądarce internetowej, ponieważ baza danych może być nieco większa. Niektóre z tych bibliotek umożliwiają również selektywne zmniejszenie zestawu danych, według których stref czasowych są obsługiwane i / lub według zakresu dat, z którymi możesz pracować.Oto biblioteki do rozważenia:
Biblioteki międzynarodowe
Nowy programista powinien wybrać jedną z tych implementacji, które opierają się na interfejsie API Intl dla danych strefy czasowej:
Biblioteki inne niż międzynarodowe
Te biblioteki są utrzymywane, ale przenoszą ciężar pakowania własnych danych strefy czasowej, które mogą być dość duże.
* Chociaż Moment i Moment-Strefa czasowa były wcześniej zalecane, zespół Moment woli teraz użytkownicy wybrali Luxon do nowego rozwoju.
Biblioteki wycofane z produkcji
Biblioteki te zostały oficjalnie wycofane i nie powinny być dłużej używane.
Przyszłe propozycje
Do Wniosek TC39 czasowe ma na celu dostarczenie nowego zestawu standardowych obiektów do pracy z datami i godzinami w języku samej JavaScript. Obejmie to obsługę obiektu rozpoznającego strefę czasową.
źródło
var date_time = new Date()
wartośćdate_time
jest (dla mnie w AEST)Date {Sun Aug 21 2016 22:18:47 GMT+1000 (AEST)}
a więc w związku z tym wydaje się, że jest przechowywany strefę czasową. Jak mogę się upewnić, żedate_time
jest to wyłącznie czas UTC, bez uwzględnienia żadnej strefy czasowej?new Date().getTime();
Jak powiedział Matt Johnson
Więc chociaż przeglądarka nie może odczytać stref czasowych IANA podczas tworzenia daty lub ma jakiekolwiek metody zmiany stref czasowych w istniejącym obiekcie Date, wydaje się, że wokół niego jest hack:
źródło
toLocaleString
odwrotnego efektu i tak, to powinna być powszechna wiedza! idź napisz artykuł na ten temat i wspomnij o mnie :-)Date
obiekt, który zwraca, jest kłamstwem. Nawet w pokazanym przykładzie dane wyjściowe ciągu zawierają strefę czasową komputera lokalnego. Na moim komputerze oba wyniki mówią „GMT-0700 (Pacific Daylight Time)”, gdzie jest to poprawne tylko dla pierwszego (Toronto jest w rzeczywistości w czasie wschodnim). Poza wyjściem łańcucha, znacznik czasu przechowywany wDate
obiekcie został przesunięty do innego punktu w czasie. Może to być użyteczna technika, ale wiąże się z wieloma zastrzeżeniami - przede wszystkim, żeDate
funkcje obiektów nie będą miały normalnej wydajności.Możesz określić przesunięcie strefy czasowej
new Date()
, na przykład:lub
Od czasu
Date
zapisania czasu UTC (tzn.getTime
Zwrotów w UTC), javascript przekonwertuje czas na UTC, a kiedy wywołasz rzeczy takie jaktoString
javascript, przekonwertuje czas UTC na lokalną strefę czasową przeglądarki i zwróci ciąg w lokalnej strefie czasowej, tj. Jeśli używamUTC+8
:Możesz także użyć normalnej
getHours/Minute/Second
metody:(Oznacza
8
to, że po przeliczeniu czasu na czas lokalny -UTC+8
liczba godzin to8
.)źródło
To powinno rozwiązać Twój problem, zachęcamy do oferowania poprawek. Ta metoda uwzględni także czas letni dla danej daty.
Jak korzystać ze strefą czasową i czasem lokalnym:
źródło
tzDate
bezpośrednio?Znalazłem najbardziej obsługiwany sposób, aby to zrobić, nie martwiąc się o bibliotekę strony trzeciej, polegającą
getTimezoneOffset
na obliczeniu odpowiedniego znacznika czasu lub aktualizacji godziny, a następnie użyciu normalnych metod w celu uzyskania niezbędnej daty i godziny.EDYTOWAĆ
Poprzednio korzystałem z
UTC
metod podczas transformacji daty, co było niepoprawne. Po dodaniu przesunięcia do czasu użycieget
funkcji lokalnych zwróci pożądane wyniki.źródło
timezone_offset
?timezone_offset
powinno byćoffset
lub odwrotnie. Zmodyfikowałem swoją odpowiedź, aby pokazać poprawną nazwę zmiennej.Wystąpił podobny problem z testami jednostkowymi (szczególnie, gdy testy jednostkowe są uruchamiane lokalnie w celu utworzenia migawek, a następnie serwer CI działa (potencjalnie) w innej strefie czasowej, co powoduje niepowodzenie porównania migawek). Kpiłem sobie z naszych
Date
i niektórych metod wspierających takich jak:źródło
Spróbuj użyć ctoc z npm. https://www.npmjs.com/package/ctoc_timezone
Ma prostą funkcjonalność do zmiany stref czasowych (większość stref czasowych około 400) i wszystkie niestandardowe formaty, które mają być wyświetlane.
źródło
Opierając się na powyższych odpowiedziach, używam tego natywnego linera do konwersji długiego ciągu strefy czasowej na ciąg trzech liter:
To da PDT lub PST w zależności od podanej daty. W moim szczególnym przypadku użycia, rozwijając się na Salesforce (Aura / Lightning), możemy uzyskać strefę czasową użytkownika w długim formacie z backendu.
źródło
Wiem, że to 3 lata za późno, ale może może pomóc komuś innemu, ponieważ nie znalazłem czegoś takiego poza biblioteką strefy czasowej, która nie jest dokładnie taka sama, jak o to tutaj prosi.
Zrobiłem coś podobnego dla niemieckiej strefy czasowej, jest to trochę skomplikowane ze względu na czas letni i lata przestępne, w których masz 366 dni.
może potrzebować trochę pracy z funkcją „isDaylightSavingTimeInGermany”, podczas gdy różne strefy czasowe zmieniają się w różnych momentach czasu letniego.
w każdym razie sprawdź tę stronę: https://github.com/zerkotin/german-timezone-converter/wiki
głównymi metodami są: convertLocalDateToGermanTimezone convertGermanDateToLocalTimezone
Włożyłem dużo wysiłku w udokumentowanie tego, więc nie będzie to tak mylące.
źródło
Wypróbuj: date-from-timezone , rozwiązuje spodziewaną datę przy pomocy natywnie dostępnej
Intl.DateTimeFormat
.Stosowałem tę metodę w jednym z moich projektów już od kilku lat, ale teraz postanowiłem opublikować ją jako mały projekt systemu operacyjnego :)
źródło
Dla użytkowników Ionic miałem z tym piekło, ponieważ
.toISOString()
musi być używany z szablonem HTML.Spowoduje to pobranie bieżącej daty, ale oczywiście można ją dodać do poprzednich odpowiedzi dla wybranej daty.
Naprawiłem to za pomocą tego:
* 60000 wskazuje UTC -6, który jest CST, więc bez względu na strefę czasową można zmienić liczbę i różnicę.
źródło
Może to ci pomoże
źródło
Napotkałem ten sam problem, użyłem tego
Console.log (Date.parse („13 czerwca 2018 10:50:39 GMT + 1”));
Zwróci milisekundy, do których możesz sprawdzić, czy strefa czasowa +100 zainicjalizuje czas brytyjski. Mam nadzieję, że to pomoże !!
źródło