Несоответствие часового пояса в momentjs и php

У нас возникают проблемы с синхронизацией представления даты и времени в php и momentjs. Допустим, у нас есть datetime с часовым поясом в Москве:

2013-06-10T10:40:00.000+04:00

Пользователь должен увидеть местное время: 2013-06-10T10:40:00. Неважно, сидит он в Испании или США. Следующий php-код выдаст правильное время, которое нам нужно:

$date = new DateTime('2013-06-10T10:40:00.000+04:00');
echo $date->format('d.m.Y H:i:s');

Результат:

10.06.2013 10:40:00

Но если мы проанализируем ту же строку даты и времени во внешнем интерфейсе с momentjs:

moment('2013-06-10T10:40:00.000+04:00').format('D.M.YYYY h:mm:ss');

Результат:

10.6.2013 8:40:00

Часовой пояс браузера — Europe/Berlin (+02:00). Использование utc() также неправильно вычисляет дату. Что нам нужно, так это местное время места, так что в случае с php оно будет правильным. Предоставление строки синтаксического анализа в momentjs:

moment('2013-06-10T10:40:00.000+04:00', "YYYY-MM-DD HH:mm").format('D.M.YYYY h:mm:ss')

будет делать свое дело, поэтому часовой пояс удаляется. Но на самом деле мы должны установить строку синтаксического анализа глобально, но как?

Спасибо за предложения.


person German    schedule 23.04.2013    source источник


Ответы (2)


Я полагаю, что на вас повлияла проблема 611 с Moment.js, которая на самом деле является запросом функции, поскольку JavaScript в любом случае не делает этого изначально. В комментариях к проблеме есть приемлемый обходной путь. Пожалуйста, добавьте свой собственный отзыв туда же. Спасибо.

ОБНОВИТЬ

С выпуском moment.js версии 2.1.0 теперь вы можете делать следующее:

var input = "2013-06-10T10:40:00.000+04:00";
var m = moment(input).zone(input);
var s = m.format('D.M.YYYY h:mm:ss');

Дополнительный вызов .zone(input) извлечет из строки только часть смещения (+04:00) и установит ее в зону, используемую для форматирования. Есть и другие варианты. См. moment#zone в документации.

ОБНОВЛЕНИЕ №2

С выпуском moment.js версии 2.3.0 теперь это один вызов:

var m = moment.parseZone(input);
person Matt Johnson-Pint    schedule 23.04.2013
comment
Спасибо, я приму участие. - person German; 24.04.2013

Попробуйте установить часовой пояс PHP на Европу/Берлин.

 date_default_timezone_set("Europe/Berlin")

Возможно, ваша установка/сервер PHP использует другой часовой пояс.

person James Elliott    schedule 23.04.2013
comment
Часовой пояс установлен правильно. Php показывает также правильное время. Momentjs - это проблема. - person German; 24.04.2013