我看過你的代碼,起初我並沒有得到相同的結果。然而,當我將時區更改爲巴西(格林威治標準時間-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());
週六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的bug,你可以在這裏跟隨:https://code.google.com/p/v8/issues/detail?id=3116
以下是Isaac Cambron做的工作來追蹤它。好吧,現在在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奇怪地將時間設定在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)
你能否提供更多的細節傳遞多少?我沒有看到這種行爲。下面是一個示例小提琴:http://jsfiddle.net/a7KPv/1/ –
我添加的Chrome版本在那裏我有問題 – earnaz
我更新了我的答案,包括艾薩克康布所做的工作以及爲V8的bug報告你跟蹤。接得好。 –