2016-04-20 12 views
1

文字列が数字か日付かを調べようとしています。 2016-04-19T23:09:10.208092Z文字列が日付か数字かを判断する

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; 
}; 

それはのような日のために働く:

は、ここに私のコードです。 問題は、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は、2つの異なる型を与えるときに動的な型指定をするので、jsエンジンは型のどれかを合理的なものに、あるいはあなたが意味すると思ったものに強制しようとします。例えば

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

ますisNaN(新しいDate())はfalseを返すです(日付は数字)

これが正しいですので、それは数に日付を変換します。

しかし、日付列に無効な値ECMA-262によって定義されたISO形式として認識されていないまたはSO

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

を提供ブラウザと値によっては、NaNをもたらさなくてもよいです

これにより、ES5以降のすべてのブラウザでNaNが返されます。

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

をので、日付がISO標準に準拠したり、それはNaNにし、厳しいチェックを使用することを確認するためにおさらい:また厳しいが、あなたが使用することができますチェックを行うに

。お役に立てれば。

+0

'new Date('23/25/2014 ')'が無効な日付を生成するかどうかは、実装ごとに依存します(Chromeでは無効、IEでは2015-11-25)。 – RobG

+0

ブラウザに依存していますか? – sebenalern

+0

日付を扱うときは、moment.jsのようなライブラリを使うのが賢明です。日付フォーマットはOS /ブラウザ/プログラミング言語から変更することができますPHPはMySQLやjavascriptとは異なる日付を解析し、 - や/は問題を引き起こします。 momentJSを使用すると、あなたは予想されるフォーマットを入れている限り、瞬間(myDate、 'MM/DD/YYYY')toDate()のような何かを行うことができ、ISOタイムスタンプを取得できます。 –

0

しかし、一般的にはJavaScriptのデザインの観点からは、私はあなたが設計しているとは思いません。 8640000000000000から最古の日付-8640000000000000までの任意の数値は、日付(1970年1月1日UTCからのミリ秒単位の時間で表されます)に変換できます。

したがって、この範囲は日付ではありません。また、範囲内に入る数字は有効な日付または数字になり、コンテキストを使用して番号または日付として解釈するかどうかを判断する必要があります。

ただし、数字が有効な日付かどうかをテストするために単純な実装を行うことはできますが、それはコンテキストなしで行うことができます。

日付が数字であるかどうかを判断することは、少し簡単です。人間が読むことができる日付の表現は、trueによってisNaN()を返し、それが絶対に数字ではないと判断するためです。次に、あなたはその文字列が日付であるかどうかを確認します。これはあなたの関数で既に行ったものです。

関連する問題