2014-01-23 85 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,我添加有一天,我有一個輸出:

​​

我又得到18次了嗎? Momentjs應該更改日期。

編輯:問題在Chrome 32.0.1700.76米

EDIT2:MomentJs版本2.5.1

EDIT3:時區UTC-3

+0

你能否提供更多的細節傳遞多少?我沒有看到這種行爲。下面是一個示例小提琴:http://jsfiddle.net/a7KPv/1/ –

+0

我添加的Chrome版本在那裏我有問題 – earnaz

+0

我更新了我的答案,包括艾薩克康布所做的工作以及爲V8的bug報告你跟蹤。接得好。 –

回答

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()); 

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

我真的很感興趣的是來自moment.js團隊的答案,如果他們回覆你的話! –

+0

這仍然是一個BUG?有什麼解決方法嗎?我嘗試使用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 M I獲得 「星期六2014年10月18日00:00:00 GMT-0300」 – earnaz

+0

@NathanielJohnson:您的代碼不包括任何調用。新增()... –

+1

@NathanielJohnson :http://plnkr.co/edit/82dfesNfTcX57OKVwm89?p=preview(帶。新增()叉子扔進...) –

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

這是一個比較老的文章,但我通過谷歌在這裏得到同樣的問題。我結束了使用了下面的代碼,也許這是對別人有所幫助:

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

一般的話,以避免類似的問題(你可以看到,他們發生,由於有時發生瀏覽器的bug):如果您代表使用Date對象,你可以有一個慣例通過中午(12:00),而不是午夜(00h00)到Date構造,然後,對準備日期功能顯示,切斷它。

在瀏覽器中,由於DST的錯誤,和一般問題由一個小時輪班的時間(時間可以追溯到從00h00到23h00前一天)。如果你只是使用中午,它不應該發生(類似錯誤的情況下,時間將返回從中午12點到11h00例如,但一天也不會改變)。

(當然,你需要記住的是,日期是中午的時候,你通過它周圍,有時可能不太好)

例如,看看在YUI庫這個bug,我們用在對我們公司的應用程序:

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的β-M(64位)

+2

號的問題是V8中的一個錯誤。現在它已經修復了。 – earnaz