2016-04-20 35 views
1

我試圖確定字符串是數字還是日期。確定字符串是日期還是數字

這裏是我的代碼:

this._getFieldFormat = (value) => { 

    // check if is date 
    let d = new Date(value); 

    if (!isNaN(d.getTime())) { 
    return 'date'; 
    } 

    // check if is boolean 
    // isNaN(false) = false, false is a number (0), true is a number (1) 
    if(typeof value === 'boolean'){ 
    return 'boolean'; 
    } 

    // check if a string is a number 
    if(!isNaN(value)){ 
    return 'number'; 
    } 

    return typeof value; 
}; 

它的工作原理像一個日期:2016-04-19T23:09:10.208092Z。 問題是1看起來是一個有效的日期(Wed Dec 31 1969 16:00:00 GMT-0800 (PST))和isNaN(new Date())是返回false(日期是一個數字)。

任何想法如何擺脫這個循環?

+0

測試任何日期格式或特定的? –

+0

任何會更好,但如果我必須選擇這是時間格式:'2016-04-19T23:09:10.208092Z' – teone

+1

是否有一個特別的原因爲什麼需要作出這種區別?另外,像2016年的「日期」 - 這些有效日期是什麼? – mc10

回答

1

所以發生了什麼叫做脅迫。由於JavaScript是動態類型,當你給它兩種不同的類型時,js引擎會試圖將其中一種類型強制爲合理的或者它所認爲的含義。

例如:

isNan("37"); is false because "37" is converted to the number 37 

isNaN(新的Date())是返回false(日期是數字)

它轉換日期爲數字,所以這是正確的。

然而,由ECMA-262所定義的可能或可能不導致NaN時,根據瀏覽器中的日期字符串無效的值不被識別爲ISO格式和值提供

所以

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

因此,這將在所有符合ES5及更高版本的瀏覽器中返回NaN。

也做了嚴格的檢查,你可以使用:

Number.isNan(new Date()); // This should return true 

所以回顧一下確保日期符合ISO標準或將爲NaN,並使用更嚴格的檢查。希望這可以幫助。

+0

請注意,新日期('23/25/2014')是否會產生無效日期,這完全取決於實施情況(在Chrome中爲2015-11-25,IE中無效)。 – RobG

+0

你的意思是依賴於瀏覽器? – sebenalern

+0

當處理日期時,它很聰明地使用像moment.js這樣的庫。日期格式可以從操作系統/瀏覽器/編程語言更改Php解析日期不同於MySQL和JavaScript使用 - 或/可能會導致問題。有了momentJS,你可以做一些像time(myDate,'MM/DD/YYYY')。toDate(),並獲得ISO時間戳,只要你把預期的格式。 –

0

但是,從Javascript的設計角度來看,我認爲你不能通過設計來完成。 8640000000000000到-8640000000000000之間的任何數字都可以轉換爲日期(表示爲從1970年1月1日UTC開始的以毫秒爲單位的時間)。

因此,任何不落下的數字都是這個範圍不能是日期。而任何落在範圍內的數字都將是有效的日期或數字,您必須使用上下文來確定您是否想將其解釋爲數字或日期。

然而,您可以做一個天真的實現來測試數字是否是有效的日期,但這是最好的,你可以做,沒有上下文。

確定一個日期是否是一個數字可能會更容易一些。因爲日期的人類可讀表示將返回trueisNaN(),從而確定它絕對不是數字。然後你會繼續檢查這個字符串是否是一個日期,你已經在你的函數中做過。

相關問題