Преобразование часовых поясов в JavaScript: Native Date против Moment.js
- пятница, 26 января 2024 г. в 00:00:17
Как full-stack разработчик, я понимаю, что управление датами и временем в разных часовых поясах может быть сложной задачей. В JavaScript родной объект Date и популярные библиотеки, такие как Moment.js, обрабатывают часовые пояса по разному. Эта статья углубляется в эти различия и предлагает рассмотреть вопросы форматов даты и времени в API, чтобы достичь ожидаемых результатов в приложениях на JavaScript.
Объект Date в JavaScript неразрывно связан с локальной часовой зоной пользователя. Когда строка времени UTC анализируется с использованием объекта Date, он автоматически преобразует время в локальную часовую зону пользователя.
Пример:
const utcDateString = '2024-01-22T15:30:00Z'; // 'Z' indicates UTC
const localDate = new Date(utcDateString);
console.log('Local Date:', localDate.toString());
Этот код выведет время в локальной часовой зоне пользователя.
В отличие от Native Date, чтобы гарантировать, что Moment.js интерпретирует время как UTC, а затем конвертирует его в локальное время, разработчик интерфейса может указать это явно.
const moment = require('moment');
const utcDateString = '2024-01-22T15:30:00Z';
const localTime = moment.utc(utcDateString).local();
console.log('Local Time with Moment.js:', localTime.format());
Этот код преобразует время UTC в локальную часовую зону пользователя с использованием Moment.js.
Пользователь видит локальное время: Если ваше приложение требует отображения пользователям локального времени в зависимости от их временной зоны, API должен возвращать время в UTC. Это позволяет фронтенд-коду на JavaScript, используя Date или библиотеки вроде Moment.js, преобразовывать это время в локальную временную зону пользователя подходящим способом.
Пример формата даты-времени: “2024–01–22T15:30:00Z” (время UTC)
Формат соответствует стандарту ISO 8601.
Пользователь видит одно и то же время независимо от временной зоны: Иногда необходимо, чтобы пользователи, независимо от их местоположения, видели одно и то же время (например, для глобальных событий, расписаний полетов или временных меток в личных блокнотах). В таких случаях API должен возвращать время без указания временной зоны.
Пример формата даты-времени: “2024–01–22T15:30:00”
Поскольку строка даты-времени не содержит информации о временной зоне, встроенный объект Date и библиотеки JS, такие как Moment.js, Luxon и Day.js, предполагают локальную временную зону пользователя. Таким образом, вывод будет таким же, как входная дата-время, но интерпретируется как локальное время.
Однако, если фронтенд-разработчик на стороне клиента интерпретирует этот формат как время UTC, как показано в примере в начале статьи, пользователь увидит неожиданно преобразованные дату и время.
ПРИМЕЧАНИЕ: Если ваш API возвращает время с указаннием временной зоны, как встроенный объект Date, так и Moment.js преобразуют его.
Пример формата даты-времени: “2024–01–22T15:30:00–05:00” (время в конкретной временной зоне, например EST)
Пример того, что увидит пользователь в GMT+4: “2024–01–23 00:30:00”
Бэкенд-разработчику важно четко документировать формат даты и времени, используемый в объектах вашего API.
Фронтенд-разработчику важно проверять формат даты и времени, возвращаемый API.
Для обоих важно:
Понимать, как различные инструменты JavaScript интерпретируют строки даты-времени.
Тестировать ваше приложение в разных временных зонах для обеспечения согласованности.
Следуя этим практикам, вы можете избежать распространенных ошибок, связанных с управлением датой и временем в JavaScript-приложениях, обеспечивая бесшовный опыт для пользователей в разных регионах.