2013-08-02 2 views
15

У меня есть веб-сервис, который возвращает дату в виде следующей строки:Moment.js и Unix Epoch Конверсия

/Date(1377907200000)/

Я использую MomentJS разобрать это на moment объекта.

moment("/Date(1377907200000)/") =>Fri Aug 30 2013 20:00:00 GMT-0400

Все это прекрасно. Но когда я звоню unix() на объект, мне присваивается значение 1377907200. Это, однако, соответствует Fri Jan 16 1970 17:45:07 GMT-0500. Я мог бы просто умножить значение, возвращаемое unix(), но это кажется неаккуратным для меня. Я подозреваю, что то, что я делаю, вызывая unix(), не совсем то, что я думаю. Нужно ли указывать какой-то формат при вызове unix()? Что мне здесь не хватает?

JSFidle showing the conversion to moment and then back.

+0

Вам не нужно преобразовывать объект даты таким образом, момент может обрабатывать 'moment (1377907200000)' просто отлично. Любопытно, почему веб-служба возвращает дату как таковую. – mix3d

+0

Мы также используем веб-сервис, который возвращает его также - это потому, что целевым потребителем API обычно является JavaScript, который выполняет «от эпохи в миллисекундах» вместо секунд. Он нацелен на наиболее вероятного потребителя. –

ответ

48

Ответ, предоставленный meagar, является правильным, от строго временной перспективы JavaScript/Unix. Однако, если вы просто умножаетесь на 1000, вы потеряете любую промежуточную точность, которая могла существовать в ваших данных.

Moment.js предлагает два разных метода, как описано in the docs. .unix() возвращает значение в секундах. Он эффективно делит на 1000 и усекает любые десятичные числа. Вы хотите использовать метод .valueOf(), который просто возвращает миллисекунды без изменений.

+1

Спасибо за дополнительную информацию. По крайней мере, для этого элемента, который не понадобится, поскольку зернистость - это всего лишь день. –

+0

О, на самом деле, я вижу, что это дает то, что я ожидал. Я бы предпочел не изменять значение каким-либо образом, поэтому ваш ответ на самом деле идеален. –

+0

Извините, meagar .. –

10

В JavaScript земли, при преобразовании Date в целое число, вы получаете ряд милли секунд с начала эпохи Unix. Традиционное время Unix - это число секунд с эпохи. Правильный вариант - умножение на 1000.

+0

Это имеет смысл. Спасибо за объяснение. –

+3

Или просто 'moment ("/Date (1377907200000)/"). ToDate(). GetTime()' –