Как заставить Moment.js игнорировать часовой пояс пользователя? - PullRequest
1 голос
/ 24 апреля 2019

У меня есть форма, в которую я ввожу событие, которое начинается в определенное время. Допустим, 9 утра.

Чтобы назначить объект даты / времени, я использую MomentJs. Проблема возникает при отображении его в разных часовых поясах.

В Лондоне покажут 9am как положено - в Киеве покажут 11am.

Как я могу заставить MomentJS и браузер игнорировать, какой часовой пояс важен для пользователя, и просто отображать время, которое я даю?

Вот мой код:

<p>
Start time:
{moment(event.startDate).format("HH:mm")} 
</p>

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

Предполагая, что вы сохранили дату как utc (что в данном случае, вероятно, должно быть), вы можете использовать следующее:

moment.utc(event.startDate).format("HH:mm")
1 голос
/ 24 апреля 2019

То, что вы хотите, это нормализованное Datetime.Это может немного запутать, поскольку концепция часовых поясов является довольно произвольной конструкцией.

Мне нравится думать о значениях Datetime как «абсолютных» и «относительных».«Абсолютная» дата-время - это та, которая истинна независимо от того, в каком часовом поясе вы находитесь. Наиболее распространенным примером из них являются UTC (+000) и время UNIX (также известные как эпоха Unix, POSIX Time или Unix Timestampe).

UTC довольно очевидно.Это текущее время в +000 часовых поясов.Время UNIX немного интереснее.Он представляет количество секунд, прошедших с 1 января 1970 года.

Вы должны всегда хранить данные, как на клиенте, так и на сервере, как «абсолютное» время.Я предпочитаю время UNIX, поскольку оно представлено в виде единого целого числа (красивое и чистое).

moment.js делает это за вас.Когда вы создаете экземпляр своего moment объекта, вы можете использовать:

var date = moment.utc(utcString)

или для Unix Time

var date = moment.unix(unixInt)

Затем вы можетеиспользуйте этот объект для отображения даты в любой форме:

console.log(date.tz.("America/Toronto"))

1 голос
/ 24 апреля 2019

Позвольте мне дать альтернативный ответ в Vanilla JavaScript. Если вы хотите сделать его часовым поясом «нейтральным», вы можете сначала преобразовать его в UTC, используя toISOString () .

const current = new Date();
const utcCurrent = current.toISOString();

console.log(utcCurrent);

Если вы хотите преобразовать его в определенный часовой пояс, например Лондон, вы можете использовать toLocaleString () . Обратите внимание на поддержку браузера для timezone.

const londonTime = new Date().toLocaleString('en-US', { timeZone: 'Europe/London' })
console.log(londonTime);
...