2016-03-06 44 views
0

我有以下的測試代碼:類Date setMonth設置怪異值

var d1 : Date = new Date("2016/02/20 15:00:00 UTC-0000"); 
    trace(d1.toUTCString()); 
    d1.monthUTC++; 
    trace(d1.toUTCString()); 

    var d2 : Date = new Date("2016/03/31 15:00:00 UTC-0000"); 
    trace(d2.toUTCString()); 
    d2.monthUTC++; 
    trace(d2.toUTCString()); 

跟蹤顯示

[trace] Sat Feb 20 15:00:00 2016 UTC 
[trace] Sun Mar 20 15:00:00 2016 UTC 
[trace] Thu Mar 31 15:00:00 2016 UTC 
[trace] Sun May 1 15:00:00 2016 UTC 

爲什麼迄今在第二個例子中跳1個月1天,而不是僅僅一個月? (從3月31日到5月1日)?

回答

1

我認爲解決之道在於Date類內部如何工作的:

當我有設定爲每月的31日的日期,例如:
"2016/03/31 15:00:00 UTC-0000"
和我通過增加一個月一,內部它變成:
"2016/04/31 15:00:00 UTC-0000"
然後這再次內部解決。但自4月份只有30天的日期溢出到五月:如果我嘗試了date字段設置爲四月31日會發生
"2016/05/01 15:00:00 UTC-0000"

同樣的事情。

而且這意味着官方的ActionScript文檔是錯誤的:

setUTCMonth()
設置月份,以及可選的一天,在世界時(UTC),並返回以毫秒爲單位的新時間。調用此方法不會修改其他字段,但如果由於調用此方法而導致星期幾發生更改,則Date.getUTCDay()和Date.getDay()方法可能會報告新值。

他們沒有想到這個邊緣情況,當設置月份也改變日期。

同樣的事情也發生在JavaScript中。