Преобразование даты в UTC с Javascript: учет часовых поясов
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Преобразование объекта Date
в формат UTC можно быстро осуществить с использованием метода toISOString
:
let utcDate = new Date().toISOString();
Данное преобразование мгновенно генерирует UTC-строку.
Методы преобразования даты
Если функционала toISOString
для вас недостаточно, есть и другие подходы. Вы можете объединить Date.UTC
и getTimezoneOffset
для более корректного перевода в формат UTC:
// Поиграем немного со временем!
let date = new Date();
let utcDate = new Date(date.getTime() + date.getTimezoneOffset() * 60000);
Таким образом, мы компенсируем локальное время с учётом разницы часовых поясов, в итоге получая чистое UTC.
Учёт перехода на летнее время и особенностей часовых поясов
Не стоит бояться проблем, связанных с переходом на летнее время и часовыми поясами. Date.UTC
поможет минимизировать эти сложности:
let utcDate = new Date(Date.UTC(year, month, day, hour, minute, second));
Этот подход поможет преодолеть ошибки, возникающие при изменении часовых поясов и дневного времени.
Надёжное использование Moment.js
Когда стоит задача продвинутой работы со временем, это место:Moment.js:
let utcDate = moment(date).utc().format();
Moment.js легко конвертирует ваше локальное время в формат UTC.
Совместимость со старыми браузерами
Если ваш браузер устарел и не поддерживает функцию toISOString
, можно добавить альтернативное решение (костыль):
if (!Date.prototype.toISOString) {
// Здесь пора написать свой метод toISOString!
}
Таким образом, недостаток поддержки в старых браузерах больше не будет проблемой.
Визуализация
Вдумайтесь, что вы настраиваете свои часы при перемещении из одного часового пояса в другой:
Часовой пояс
Часы: 🕓 Ваше местное время
Переход на: ➡️ UTC
Преобразование даты в UTC в JavaScript подобно переводу ваших часов на GMT:
new Date().toUTCString(); // 🕓➡️🕛 Подарок – время по UTC на часах! Здорово, не правда ли?
Тестирование преобразований часовых поясов для обеспечения надёжности
Чтобы убедиться в точности ваших преобразований, необходимо провести тщательное тестирование:
console.assert(new Date('2023-01-01T12:00:00Z').getTime() === new Date(Date.UTC(2023, 0, 1, 12)).getTime());
// Результаты должны совпасть. Если нет, обвините 2022 год за то, что он еще не достиг 2023-го.
Тестирование следует осуществлять до тех пор, пока вы полностью не убедитесь в корректности работы приложения со временными зонами.
Работа с UTC на серверной стороне
При обработке строки с датой и временем на сервере, важно преследовать последовательность действий:
let serverDate = moment.utc('2023-01-01T12:00:00+02:00').toDate();
// Готовы к путешествию во времени?
Использование UTC на сервере поможет избавиться от проблем, связанных с различиями в часовых поясах.
Полезные материалы
- Date.UTC() – JavaScript | MDN — Всё, что нужно знать о
Date.UTC()
. - Date.prototype.toISOString() – JavaScript | MDN — Подробно о
toISOString
. - The definitive guide to JavaScript Dates — Универсальное руководство по работе с объектом Date и часовыми поясами.
- ISO 8601 – Wikipedia — Полное описание стандарта ISO 8601.
- javascript – How to convert a Date to UTC? – Stack Overflow — Полезные советы от пользователей по конвертации дат в UTC.
- Date and time — Взгляд JavaScript.Info на работу с датами и временем.
- JavaScript Date UTC() Method — Интерактивный пример того, как метод
UTC()
может внести изменения в ваш код.