2014-01-23 6 views
12

В Moment.js У меня есть следующая проблема:Moment.js выпуск добавления дней с летним временем

1.I создать дату момента:

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.Now, я добавляю в один прекрасный день у меня есть следующий вывод:

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

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

EDIT: Проблема в Chrome 32.0.1700.76 м

EDIT2: MomentJs версия 2.5.1

EDIT3: Timezone UTC-3

+0

Можете ли вы предоставить более подробную информацию? Я не вижу такого поведения. Вот пример скрипта: http://jsfiddle.net/a7KPv/1/ –

+0

Я добавил версию Chrome, где у меня проблема – earnaz

+0

Я обновил свой ответ, чтобы включить работу, проделанную Isaac Cambron, и отчет об ошибке для V8 для вы должны отслеживать. Хороший улов. –

ответ

15

Я посмотрел на вас код и сначала я не получил те же результаты. Однако, когда я изменил часовой пояс в Бразилии (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' 

Проблема заключается в том, что момент в основном делает это:

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) 
+0

Мне бы очень хотелось получить ответ от команды moment.js, если они возвратятся к вам! –

+0

Является ли это еще БУГОМ? Есть ли обходной путь? Вместо этого я попытался использовать setDate, и он тоже не работал. – Juliomac

+0

Это исправлено. https://bugs.chromium.org/p/v8/issues/detail?id=3116 –

3

Согласно этому 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 
+0

В 2 тестах с Chrome 32.0.1700.76 м я получаю «Сб окт 18, 2014 00:00:00 GMT-0300» – earnaz

+0

@NathanielJohnson: В вашем коде не содержится никакого вызова .add() ... –

+1

@NathanielJohnson : http://plnkr.co/edit/82dfesNfTcX57OKVwm89?p=preview (вилка с .add() брошена в ...) –

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

1

Это довольно старый пост, но я попал сюда через 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); 
0

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

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

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

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

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

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

1

Вы должны пройти ряд первого, а затем "дни"

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 бета-м (64-бит)

+2

№ Проблема. ошибка в V8. Теперь это исправлено. – earnaz

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