Форматирование даты с моментом JS, чтобы соответствовать - PullRequest
2 голосов
/ 15 мая 2019

Я использую сторонний API вместе с Moment JS для некоторого форматирования даты в Javascript.

Сторонний API группирует некоторые данные / результаты с epoch датой в миллисекундах, например:

1559260800000

Это равно :
Время по Гринвичу: пятница, 31 мая 2019 года 00: 00: 00
Ваш часовой пояс: пятница, 31 мая 2019 года 01:00:00 по Гринвичу + 01:00 по летнему времени
Относительно: через 15 дней

Мы используем календарь Flatpickr для выбора даты. Когда дата выбрана, она возвращает выбранную дату в местном формате даты, таком как:

Fri May 31 2019 00:00:00 GMT+0100 (British Summer Time)

Если я использую момент для преобразования, я получаю следующее:

var epoch = moment.utc(dayElem.dateObj).valueOf();
1559257200000

Это соответствует:
Время по Гринвичу: четверг, 30 мая 2019 года 23: 00: 00
Ваш часовой пояс: пятница, 31 мая 2019 года 00:00:00 GMT + 01: 00 DST
Относительно: через 15 дней

Я понимаю, что проблема связана с местным часовым поясом, первое из которых - GMT 00:00:00, а второе - GMT 00:01:00, но я не уверен, как его решить.

Кроме того, более поздние даты в году, такие как декабрь, когда мы находимся за пределами BST, - это время по Гринвичу, поэтому мне нужно, чтобы и тогда это работало.

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Поскольку ваш инструмент выбора даты производит Date объектов по местному времени, но вы действительно хотите, чтобы они были по UTC, вы можете сделать следующее:

var timestamp = moment(dayElem.dateObj).utc(true).valueOf();

Передача true в функцию utc скажет ей сохранить значение даты и времени и сместить смещение с компромиссом выбора другого момента времени. В вашем случае это похоже на то, что вам нужно.

Также, Пожалуйста, не называйте это Epoch Time . :)

0 голосов
/ 15 мая 2019

Звучит так, как будто вы хотите, чтобы даты в окне выбора даты были конвертированы в метки времени, представляющие полночь в часовом поясе UTC в выбранную дату.

Делает ли это то, что вы хотите?

new Date(moment(dayElem.dateObj).toISOString(true).slice(0, 10)).valueOf()

Кроме того, вы можете использовать стандартные Date методы и полностью избегать moment:

var dateObj = dayElem.dateObj;
var utcMidnight = Date.UTC(dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate()); 
...