Moment.js выпускает дни с летним временем

В Moment.js у меня есть следующая проблема:

1. Создаем дату:

var m = moment(new Date(2014, 9, 18, 0, 0, 0));

2.Если я вызываю функцию toString:

m.toString() //"Sat Oct 18 2014 00:00:00 GMT-0300"

3. Теперь, я добавляю один день, когда у меня следующий вывод:

m.add("days",1).toString() //"Sat Oct 18 2014 00:00:00 GMT-0300"

Что я получу снова? Momentjs должен изменить дату.

РЕДАКТИРОВАТЬ: Проблема в Chrome 32.0.1700.76 м

EDIT2: версия MomentJs 2.5.1

EDIT3: Часовой пояс UTC-3

Ответ 1

Я посмотрел на ваш код и поначалу не получал таких же результатов. Однако, когда я изменил часовой пояс в Бразилии (GMT-03: 00) - Сан-Паулу, я получил тот же результат. Это явно ошибка, и теперь она прослеживается до V8 и сообщается.

Plunker

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString());
console.log(m.add("days",1).toString());

Сб. 18 окт. 2014 00:00:00 GMT-0300 script.js: 4

Сб. 18 окт. 2014 00:00:00 GMT-0300 script.js: 5

Я отправил ошибку: https://github.com/moment/moment/issues/1440

Обновление

Moment.js не несет ответственности за эту ошибку. Отслеживается ошибка в V8 (механизм javascript, используемый как Chrome, так и Node). Я подал ошибку с V8, которую вы можете найти здесь: https://code.google.com/p/v8/issues/detail?id=3116

Вот работа, которую Исаак Камброн сделал для ее отслеживания.

ОК, воспроизведенный теперь как в Ubuntu, так и в OSX (раньше я использовал другой бразильский город). Я использую Node, а не Chrome, но для наших целей V8 - это V8.

moment([2014, 9, 18]).add(1, 'd').format(); //=> '2014-10-18T00:00:00-03:00'

Проблема в том, что Moment по существу делает это:

var d = new Date(2014, 9, 18);
d.setDate(19);
d.toString(); // => Sat Oct 18 2014 23:00:00 GMT-0300 (BRT)
//wtf?

Затем он устанавливает часы в ноль. Поскольку V8 странно устанавливает время до конца 18 октября, хотя мы специально попросили его установить его до 19 октября, ответ выходит неправильно. Это особенно странно, потому что переход на летнее время - это переход вперед, то есть, если что-то должно закончиться с 1:00, а не 23:00 предыдущего дня.

Фактически, он даже делает это:

new Date("October 18, 2014"); //=> Sat Oct 18 2014 00:00:00 GMT-0300 (BRT)
new Date("October 19, 2014"); //=> Sat Oct 18 2014 23:00:00 GMT-0300 (BRT)

Ответ 2

В соответствии с этим jsFiddle, что вы делаете/должны/должны работать. Какой браузер вы тестируете?

http://jsfiddle.net/mori57/Nq3KD/

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString()); // Firebug output: Sat Oct 18 2014 00:00:00 GMT-0400
console.log(m.add("days",1).toString()); // output: Sun Oct 19 2014 00:00:00 GMT-0400

Ответ 3

Просто вы можете использовать приведенный ниже код, чтобы получить следующую дату в moment.js

var date='2014/09/18';
var nextDate = moment(date, 'YYYY/MM/DD').add('days', 1).format('YYYY/MM/DD');
console.log(nextDate); // 2014/09/19

Подробнее см. ниже ссылку

momentjs docs

Ответ 4

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

    var then = moment("23.07.2014", "DD.MM.YY");
    var before = moment.unix(then.unix()-86400); // 86400 seconds/day
    var after = moment.unix(then.unix()+86400);

Ответ 5

Сначала вы должны передать номер, а затем "дни"

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
console.log(m.toString());
console.log(m.add(1, "days").toString());

Протестировано в Chrome версии 50.0.2661.37 beta-m (64-разрядная версия)

Ответ 6

Общее замечание, чтобы избежать таких проблем (как вы можете видеть, они происходят, а иногда происходят из-за ошибки браузера): если вы представляете день с использованием объекта Date, вы можете просто иметь (12:00) вместо полуночи (0000) для конструктора Date, а затем в функции, которая подготавливает дату для отображения, отключите ее.

Ошибки в браузерах и проблемы, связанные с DST, обычно меняют время на один час (время возвращается с 00:00 до 23:00 предыдущего дня). Если вы просто используете полдень, это не должно происходить (в случае подобных ошибок время будет возвращаться с 12:00 до 11:00, например, но день не изменится).

(Конечно, вы должны помнить, что дата полдень, когда вы его проходите, иногда это может быть плохо)

Например, посмотрите на эту ошибку в библиотеке YUI, которую мы использовали в наших корпоративных приложениях:

https://github.com/yui/yui2/pull/15

Это произошло только в Firefox, только в Windows, только в определенном часовом поясе и только в конкретном месяце. Но это произошло.