Date
對象基於即毫秒的自1970年1月1日UTC的數量和時間值有以下構造
new Date();
new Date(value);
new Date(dateString);
new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);
從docs,
dateStringnew Date(dateString)
是表示日期的字符串值。字符串應該是在一個 格式由Date.parse()法確認(IETF兼容RFC 2822 時間戳並且也是版本ISO8601的)。
現在date.js看v8 sourcecode:
function DateConstructor(year, month, date, hours, minutes, seconds, ms) {
if (!%_IsConstructCall()) {
// ECMA 262 - 15.9.2
return (new $Date()).toString();
}
// ECMA 262 - 15.9.3
var argc = %_ArgumentsLength();
var value;
if (argc == 0) {
value = %DateCurrentTime();
SET_UTC_DATE_VALUE(this, value);
} else if (argc == 1) {
if (IS_NUMBER(year)) {
value = year;
} else if (IS_STRING(year)) {
// Probe the Date cache. If we already have a time value for the
// given time, we re-use that instead of parsing the string again.
var cache = Date_cache;
if (cache.string === year) {
value = cache.time;
} else {
value = DateParse(year); <- DOES NOT RETURN NaN
if (!NUMBER_IS_NAN(value)) {
cache.time = value;
cache.string = year;
}
}
}
...
它看起來像DateParse()
沒有爲返回NaN的像'asd qw 101'
一個字符串,因此錯誤。您可以與Date.parse('asd qw 101')
在Chrome(v8) [返回-58979943000000
]和Gecko(Firefox) [返回NaN]進行交叉檢查。Sat Jan 01 101 00:00:00
來的時候,你的種子new Date()
與-58979943000000時間戳(兩個瀏覽器)
是有破V8日期解析器什麼解決辦法?
我不會說V8日期解析器壞了。它只是試圖以最好的方式滿足字符串RFC 2822 standard,但壁虎和
中斷
在某些情況下給出了不同的結果。
嘗試在這兩個瀏覽器(V8)和Firefox(壁虎)new Date('Sun Ma 10 2015')
不爲其他異常。 這裏鉻不能決定天氣'馬'代表'三月'或'五月',並給出一個無效日期而Firefox不。
解決方法:
您可以創建自己的包裝圍繞Date()
來過濾那些字符串V8自己的解析器不能。但是,在ECMA-5中繼承內置插件是不可行的。在ECMA-6,這將有可能繼承內置構造函數(數組,日期和錯誤) - reference
但是你可以用一個更強大的正則表達式驗證字符串對RFC 2822/ISO 8601
^(?:(?:31(\/|-|\. |\s)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.|\s)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.|\s)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.|\s)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
圖片來自debuggex
因此產生的,好像V8 AINT壞了,它只是工作方式不同。
希望它有幫助!
你想檢測哪些日期? – Bergi
爲什麼這會被投票? – Rishav
@Bergi添加預計日期 –