Moment.js使用夏令时添加天数

ear*_*naz 13 javascript date momentjs

在Moment.js中我有下一个问题:

我创造了一个时刻日期:

var m = moment(new Date(2014, 9, 18, 0, 0, 0));
Run Code Online (Sandbox Code Playgroud)

2.如果我调用toString函数:

m.toString() //"Sat Oct 18 2014 00:00:00 GMT-0300"
Run Code Online (Sandbox Code Playgroud)

3.现在,我添加一天我有下一个输出:

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

我又得了18个?Momentjs应该改变日期.

编辑:Chrome 32.0.1700.76 m中的问题

EDIT2:MomentJs版本2.5.1

EDIT3:时区UTC-3

Nat*_*son 15

我看了你的代码,起初我没有得到相同的结果.然而,当我将时区改为巴西(格林威治标准时间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());
Run Code Online (Sandbox Code Playgroud)

2014年10月18日星期六00:00:00 GMT-0300 script.js:4

2014年10月18日星期六00:00:00 GMT-0300 script.js:5

我提交了一个错误:https://github.com/moment/moment/issues/1440

更新

Moment.js不对此错误负责.它已被追踪到V8中的一个错误(Chrome和Node使用的javascript引擎).我已经在V8中提交了一个错误,您可以在此处访问:https: //code.google.com/p/v8/issues/detail?id = 311

以下是艾萨克·坎布朗为追踪它所做的工作.

好了,现在在Ubuntu和OSX中再现(之前我在测试中使用了不同的巴西城市).我使用的是Node,而不是Chrome,但出于我们的目的,V8是V8.

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

问题是Moment基本上是这样做的:

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

然后它将小时数设置为零.由于V8奇怪地将时间设定为10月18日晚,即使我们特别要求它将其设置为10月19日,但答案出错了.这一切都特别奇怪,因为这里的DST转换是向前跳跃,这意味着它应该在前一天的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)
Run Code Online (Sandbox Code Playgroud)