2017-01-31 27 views
1

我無法理解爲什麼javascript給出的有效日期等於1 dec給出無效日期的日期?這種行爲是否由於特定原因而被納入語言中?因爲它必須是無效的日期我的使用情況 新的日期(「2017年11月31日」)有效日期來自invalida日期的輸出Javascript

+0

我從來沒有能夠學習Date構造函數解析器的所有規則和異常。你確定它應該總是拒絕美國格式的日期嗎? –

+0

http://stackoverflow.com/questions/8098202/javascript-detecting-valid-dates – msg

回答

1

首先,在Date constructor沒有設計驗證輸入,甚至是挑剔。相反,它是明確設計不惜任何代價,以創建一個實例,像這樣的創意規則:

當日期被稱爲具有一個以上參數的構造,如果 值低於其合理的範圍更大(例如提供13作爲月份值的 或者作爲分鐘值的70),相鄰值將被調整爲 。例如。新的日期(2013,13,1)相當於新 日期(2014年1,1)

所以如果你真的需要驗證的約會,你需要尋找別的地方。

如約11/31/2017,構造預計這樣的:

字符串值表示日期。該字符串應採用Date.parse()方法(IETF-compliant RFC 2822 timestamps以及ISO8601版本)識別的格式 。

...看起來不錯。但這如下(重點煤礦):

與Date構造日期字符串的解析(和Date.parse, 它們是等價的)強烈勸阻由於瀏覽器 分歧和矛盾

如果我們深入Date.parse()文件,我們終於閱讀本:

ECMAScript規範規定:如果String不符合 標準格式的功能可能回落到任何 implementation-具體的啓發式算法或實現特定的解析算法。無法識別的字符串或包含ISO格式字符串中的非法元素 值的日期應導致Date.parse()返回 NaN。

// Non-ISO string with invalid date values 
new Date('23/25/2014'); 

將:

然而,由ECMA-262所定義的可能或可能不導致NaN時,取決於 瀏覽器和值提供,例如在日期字符串無效的值不被識別爲ISO格式 在Safari 7

被視爲2015年11月25日,在火狐30和 無效的日期本地日期此回退的情況下是一個你的約會落入。