Фон
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)
У середовищах, в яких реалізований інтернаціоналізаційний інтерфейс інтерфейсу 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'
це слід ретельно перевірити, чи потрібно підтримувати старі браузери або нетипові середовища (наприклад, легкі пристрої IoT).
Бібліотеки
Є кілька бібліотек, які можна використовувати для роботи з часовими поясами. Хоча вони все ще не можуть змусити Date
об'єкт поводитись інакше, вони, як правило, реалізують стандартну базу даних часових поясів IANA та надають функції для її використання в JavaScript. Сучасні бібліотеки використовують дані часового поясу, що надаються API Intl, але старші бібліотеки зазвичай мають накладні витрати, особливо якщо ви працюєте у веб-браузері, оскільки база даних може бути трохи великою. Деякі з цих бібліотек також дозволяють вибірково скорочувати набір даних, або за допомогою яких підтримуються часові пояси та / або за діапазоном дат, з якими можна працювати.
Ось бібліотеки, які слід врахувати:
Бібліотеки, засновані на міжнародному рівні
Нова розробка повинна обрати одну з таких реалізацій, яка спирається на API Intl для даних часового поясу:
Неінтегральні бібліотеки
Ці бібліотеки підтримуються, але несуть тягар упаковки власних даних часового поясу, який може бути досить великим.
* У той час, як раніше рекомендувались Moment і Moment-Timezone, команда Moment тепер вважає за краще, щоб користувачі обрали Luxon для нової розробки.
Бібліотеки, що припиняються
Ці бібліотеки були офіційно припинені і більше не повинні використовуватися.
Майбутні пропозиції
У Пропозиція TC39 Тимчасові мети , щоб забезпечити новий набір стандартних об'єктів для роботи з датами і часом в самій мові JavaScript. Сюди входить підтримка об’єкта, знаючого часовий пояс.