2012-04-04 7 views
15

Я использую moments.js для работы с датами в javascript. Все даты указаны в формате UTC (или должны быть).Moment.js diff между датами UTC

У меня есть следующие даты (60 минут от текущего времени):

//Wed, 04 Apr 2012 21:09:16 GMT 
to = moment.utc().add('m', 60).toDate(); 

Теперь я хочу, чтобы получить разницу в секундах между этой датой и текущей UTC DateTime, так что я:

seconds = moment.utc().diff(to, 'seconds'); 

Это возвращает 10800 вместо 3600, поэтому 3 часа, а не один.

Любые идеи, что я делаю неправильно?

Спасибо!

EDIT:

Я обновил строку seconds = moment().diff(to, 'seconds'); и получает currect секунд, но это -3600 вместо позитива.

EDIT:

теперь у меня есть объекты эти два момента:

{ _d: Thu, 05 Apr 2012 17:33:18 GMT, _isUTC: true } 
{ _d: Thu, 05 Apr 2012 16:38:45 GMT, _isUTC: true } 

d1 и d2.

Когда я сделаю d1.diff(d2, 'hours', true);, это возвращает 4. Это определенно связано с UTC, я думаю, но похоже, что должен работать.

ответ

0

Могут быть часовые пояса, потому что вы используете toDate(). Попробуйте просто работать непосредственно с моментом (т. Е. Изменить его на to = moment.utc().add('m', 60);).

+0

Hm, что «до» действительно значение приходит из базы данных, что был создан с использованием кода выше, поэтому я должен использовать toDate(), чтобы получить строку для хранения. – dzm

+0

@Super Я отредактировал сообщение. Работа с моментальными объектами, которые являются UTC, получая аналогичные проблемы. – dzm

16

Это законная ошибка. Я только что подал его здесь: https://github.com/timrwood/moment/issues/261

Чтобы обойти его, используйте вместо него следующее.

var a = moment.utc().add('m', 60).toDate(), 
    b = moment().diff(to, 'seconds'); // use moment() instead of moment.utc() 

Кроме того, если вам нужно получить toString о дате, вы можете использовать moment().toString() как это прокси для обернутого Date().toString()

+7

Только FYI, это было исправлено в версии 1.6.0. – timrwood

+0

Ошибка все еще существует при работе с Summer Time. Пример: Разница в днях между 15/10/2017 и 22/10/2017 (UTC). Первая дата не в бразильском летнем времени, а вторая. Исправление, которое вы предложили выше, сделало трюк. – Joaobrunoah