Преобразование часовых поясов в JavaScript: Native Date против Moment.js

70047c75b7cdcf17116e23765fd39cf0.png

Как full-stack разработчик, я понимаю, что управление датами и временем в разных часовых поясах может быть сложной задачей. В JavaScript родной объект Date и популярные библиотеки, такие как Moment.js, обрабатывают часовые пояса по разному. Эта статья углубляется в эти различия и предлагает рассмотреть вопросы форматов даты и времени в API, чтобы достичь ожидаемых результатов в приложениях на JavaScript.

Объект Date в JavaScript и время в UTC


Объект 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());

Этот код выведет время в локальной часовой зоне пользователя.

Moment.js и обработка Time Zone

В отличие от 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

Пользователь видит локальное время: Если ваше приложение требует отображения пользователям местного времени в зависимости от их временной зоны, 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-приложениях, обеспечивая бесшовный опыт для пользователей в разных регионах.

© Habrahabr.ru