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 czasu 1970-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. Gdy Date
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:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
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 poprzez timeZone
opcję toLocaleString
i jej odmiany. Większość implementacji obsługuje identyfikatory stref czasowych IANA, takie jak 'America/New_York'
. Na przykład:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
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ą.