2013-12-20 2 views
7

Для службы oData Rest, я использую Moment.js для создания даты из отметки времени Unix, и я бы хотел игнорировать часовой пояс. Мой день "2013-12-24", что составляет 1387839600 в Unix секунд.Дата создания из Unix Временная метка, игнорирующая часовой пояс

Использование

moment("2013-12-24", "YYYY-MM-DD").toISOString() 

результаты в "2013-12-23T23: 00: 00.000Z", так как я живу в GMT + 1. При использовании

moment.utc("2013-12-24", "YYYY-MM-DD").toISOString() 

Я получаю "2013-12-24T00: 00: 00.000Z", который является именно то, что я хочу. Я могу просто удалить Zulu time «Z» в конце.

Но реальное представление моей даты - это временная метка Unix. Так что, если я

moment.utc(1387839600, "X").toISOString() 

Я всегда получаю "2013-12-23T23: 00: 00.000Z", но я хочу, чтобы вернуться "2013-12-24T00: 00: 00.000Z".

Где моя ошибка? Спасибо за помощь!

+0

Использование moment.utc (момент ("1387839600", "X") формат. ("L"), "ДД.ММ.ГГГГ"). ToISOString() работает, но это кажется довольно сложным !? – Windwalker

+1

Или просто 'момент (1387839600, 'X'). Format ('YYYY-MM-DDT00: 00: 00.000')'? – robertklep

+0

Спасибо @robertklep, я хотел бы принять ваш комментарий как ответ на мой вопрос, но, к сожалению, я не могу продвигать ваш комментарий к полному ответу ... – Windwalker

ответ

16

Временные метки Unix, будь то в секундах или миллисекундах, являются всегда в UTC. Значение 1387839600 действительно 2013-12-23 в 23:00 UTC. Для проверки используйте sites like this one.

Если вы хотите, чтобы это было 2013-12-24 в полночь UTC, отметка времени была бы 1387843200.

Итак, момент ведет себя правильно. Вместо этого вы должны сосредоточиться на своем API для отдыха и убедиться, что он правильно испускает UTC, а не местное значение времени.

Кроме того, если вы просто хотите использовать дату, то не используйте .toISOString. Вместо этого используйте .format, такие как:

moment.utc(1387843200, 'X').format('YYYY-MM-DD') 
5

Вы можете 'составить' свой собственный формат. Любые строки, которые необходимо скопировать как есть (не интерполированы), должны содержаться в скобках.

Таким образом, в вашей ситуации, это должно работать:

moment(1387839600, 'X').format('YYYY-MM-DD[T00:00:00.000]') 
+0

YYYY-MM-DD - действительная дата ISO! http://en.wikipedia.org/wiki/ISO_8601 – laktak

1

Не используйте toISOString(). Вместо того, чтобы использовать что-то вроде этого:

moment.utc(1387839600, "X").utcOffset(1).format('YYYY-MM-DD') + "[T" + moment.utc(1387839600, "X").utcOffset(1).format('HH:mm:ss.000]') 
2

После настройки функции OnChange, как

<DateTimeField mode="date" inputFormat='MM-DD-YYYY' onChange= {this.onChange} />

Функция OnChange может выглядеть следующим образом:

onChange: function(value) { console.log({myDate: moment.utc(value, 'x').format('YYYY-MM-DDTHH:mm:ss.SSSZ')}); },

Кажется OnChange значение вводится как временная метка Unix ms (x) вместо метки времени Unix (X) в случае, если когда-либо путаница.

Это должно напечатать строку как 2015-07-15T15:02:00.000+00:00

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