2016-10-06 9 views
1

У меня есть следующая дата в формате utc, которую я хочу конвертировать и отображать как локальное время.moment.js не удалось преобразовать дату utc в локальную дату

// utc 
date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)'; 

// convert to local 
moment.utc(date).local().format("ddd MMM DD YYYY HH:mm:ss"); 

Ожидаемые результаты при использовании выше должно быть:

Thu Oct 27 2016 08:00:00 

Но фактические результаты показываются следующим то время не меняется?

Thu Oct 27 2016 07:00:00 
+0

Не будет '' (GMT Стандартное время) '' выбросить его? – evolutionxbox

+0

Нет, но '+ 0100' будет. –

+0

UTC - это стандарт, а не формат. ;-) – RobG

ответ

3

Несколько вещей:

  • Ваш ввод представляет собой строку в нестандартном формате. Вероятно, вы получили его, взяв объект Date и вызвав функцию .toString(), но это не значит, что он подходит для синтаксического анализа по моменту. Если вы заглянете в консоль отладки, вы найдете предупреждающее сообщение, потому что вы что-то передали в какой-то момент, не понимаете изначально и поэтому передаете его обратно в конструктор Date. См. the user guide, в котором объясняется, что вы должны передать спецификатор формата, когда у вас есть пользовательский ввод.

  • Ваш вход содержит смещение часового пояса +0100. Это означает, что время 7:00 составляет UTC + 1, что эквивалентно 6:00 UTC. Это значение, которое имеет момент, когда вы впервые разобрали его с помощью moment.utc(yourInput)

  • Вы затем конвертируете 6:00 UTC по местному времени, когда вы вызываете функцию local(). Это 7:00 UTC + 1, которое вы видите.

Как это решить, это зависит от того, что вы на самом деле хотите сделать. Вы сказали, что ожидали 8:00 UTC, но это не имеет смысла с введенного вами ввода, потому что 7:00 (+1) == 6:00 (+0).

Если вы имели в виду, что вы хотели утверждать, что исходное значение времени действительно было UTC, а не UTC + 1, даже если оно находится на вашем входе, тогда укажите строку формата, которая содержит только те части, которые вам интересны. В режиме раздельного разбора Moment по умолчанию игнорируется что-либо постороннее.

date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)'; 
moment.utc(date, 'ddd MMM DD YYYY HH:mm:ss').local().format("ddd MMM DD YYYY HH:mm:ss"); 

Другими словами, ваша дата ввода только Thu Oct 27 2016 07:00:00 здесь, а остальное игнорируется. Вы утверждаете, что он находится в UTC, передав его в moment.utc, а затем, когда вы конвертируете его в локальный, он закончится в 8:00.

Однако, несмотря на то, что вы просили, я думаю, что date на самом деле JavaScript Date объект, чья строка вывод .toString() является то, что вы показываете здесь. В этом случае объект Date уже представляет определенный момент времени, который составляет 6:00 UTC.Так что неважно, делаете ли вы moment.utc(date).local() или просто moment(date). Оба оставят вас в тот же момент времени, представленный местным часовым поясом.

Возможно, вы захотите вернуться к своему входу и выяснить, как вы его включили в число GMT+0100, когда вы думаете, что это фактически значение UTC. Учтите, что если у вас на самом деле было 8:00 UTC, ваш вход сказал бы 09:00 GMT+0100.

+0

Я использую следующий библиотечный файл http://jkbrzt.github.io/rrule/ - вы можете проверить, что я имею в виду, введя следующую дату: «2016-10-27T08: 00: 00' в поле dtstart. Он будет генерировать дату как '20161027T060000Z', а в результатах библиотека возвращает даты как строку в следующем формате' Thu Oct 27 2016 07:00:00 GMT + 0100 (GMT Standard Time) '. Я пытаюсь отформатировать эту строку в локальное время. Я могу только заставить его работать, если я делаю 'moment.utc (date, 'ddd MMM DD YYYY HH: mm: ss'). Local(). Format (" ddd MMM DD YYYY HH: mm: ss ") ; '. Выполнение 'moment. (Date) .local()' не работает? – adam78

+0

Извините, я не буду следовать за тобой. Вы должны задать новый вопрос, конкретно используя эту библиотеку, и создать jsFiddle, показывающий, как вы используете эту библиотеку и момент вместе. Все, что я могу сказать, звучит так, будто у вас уже есть местное время, поэтому мне не нужно, чтобы вы хотели конвертировать что-нибудь, чтобы получить местное время. –

+0

Кроме того, это поможет узнать, в каком реальном часовом поясе вы находитесь, поскольку он появляется в одном случае, у вас есть GMT + 2, а в другом - GMT + 1. –

0

Вы можете использовать Moment TimeZone с MomentJS (http://momentjs.com/timezone/)

date = moment.tz("Thu Oct 27 2016 07:00:00", "GMT Standard Time"); 
date.clone().local().format('ddd MMM DD YYYY HH:mm:ss'); 

EDIT:

Удаление utc часть фиксирует это для меня без Moment TimeZone:

date = 'Thu Oct 27 2016 07:00:00 GMT+0100 (GMT Standard Time)'; 
moment(date).local().format('ddd MMM DD YYYY HH:mm:ss'); 
+0

это не работает, потому что моя строка '' Thu Oct 27 2016 07:00:00 GMT + 0100 (GMT Standard Time) "' где вы используете '' Thu Oct 27 2016 07:00:00 ", «GMT стандартное время» ' – adam78

+0

@ adam78 Я обновил свой ответ. –

+0

для этого не требуется момент-часовой пояс, а также '' GMT Standard Time '' действительный идентификатор часового пояса IANA. –

Смежные вопросы