Задний план
Date
Объект JavaScript отслеживает время в UTC внутри, но обычно принимает ввод и производит вывод в местное время компьютера, на котором он работает. Здесь очень мало возможностей для работы со временем в других часовых поясах.
Внутреннее представление Date
объекта - это одно число, представляющее количество миллисекунд, прошедших с тех пор 1970-01-01 00:00:00 UTC
, без учета високосных секунд. В самом объекте Date нет часового пояса или формата строки. При использовании различных функций Date
объекта локальный часовой пояс компьютера применяется к внутреннему представлению. Если функция создает строку, то информация о локали компьютера может быть принята во внимание, чтобы определить, как создать эту строку. Детали варьируются в зависимости от функции, а некоторые зависят от реализации.
Единственные операции, которые Date
объект может выполнять с нелокальными часовыми поясами:
Он может анализировать строку, содержащую числовое смещение UTC из любого часового пояса. Он использует это для настройки анализируемого значения и сохраняет эквивалент UTC. Исходное местное время и смещение не сохраняются в результирующем Date
объекте. Например:
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)
В средах, в которых реализован API интернационализации ECMASCript (он же Intl), Date
объект может создавать строку, зависящую от локали, настроенную для данного идентификатора часового пояса. Это достигается с помощью timeZone
опции toLocaleString
и ее вариантов. Большинство реализаций будет поддерживать идентификаторы часовых поясов IANA, такие как 'America/New_York'
. Например:
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)
Большинство современных сред поддерживают полный набор идентификаторов часовых поясов IANA ( см. Таблицу совместимости здесь ). Однако, имейте в виду , что только идентификатор требуемого для подкрепляться Intl является 'UTC'
, таким образом , вы должны тщательно проверить , если вам необходимо поддерживать старые браузеры или атипичные среды (например, легкие устройства ВГД).
Библиотеки
Есть несколько библиотек, которые можно использовать для работы с часовыми поясами. Хотя они по-прежнему не могут заставить Date
объект вести себя по-другому, они обычно реализуют стандартную базу данных часовых поясов IANA и предоставляют функции для ее использования в JavaScript. Современные библиотеки используют данные о часовых поясах, предоставляемые API-интерфейсом Intl, но более старые библиотеки обычно имеют накладные расходы, особенно если вы работаете в веб-браузере, поскольку база данных может стать немного больше. Некоторые из этих библиотек также позволяют выборочно сокращать набор данных либо по поддерживаемым часовым поясам, либо по диапазону дат, с которыми вы можете работать.
Вот библиотеки для рассмотрения:
Intl-based библиотеки
Новая разработка должна выбрать одну из этих реализаций, которые полагаются на API-интерфейс Intl для своих данных часового пояса:
Не международные библиотеки
Эти библиотеки поддерживаются, но несут бремя упаковки собственных данных часовых поясов, которые могут быть довольно большими.
* Хотя ранее были рекомендованы Moment и Moment-Timezone, команда Moment теперь предпочитает, чтобы пользователи выбрали Luxon для новой разработки.
Прекращенные библиотеки
Эти библиотеки были официально прекращены и больше не должны использоваться.
Будущие предложения
В Предложение TC39 Временные цели , чтобы обеспечить новый набор стандартных объектов для работы с датами и временем в самом языке JavaScript. Это будет включать поддержку объекта, осведомленного о часовом поясе.