1

日付を解析して日時オブジェクトを作成したい。次のコードを使用しています。

function generateDateObject (dateString, timeString) {
    // Date string has the format: dd/mm/yy (4 digit year)
    // Time string has the format: hh:mm
    var dateSplit = dateString.split('/');
    var timeSplit = timeString.split(':');

    var date   = parseInt(dateSplit[0]);
    var month  = parseInt(dateSplit[1])-1; // Counting starts from zero
    var year   = parseInt(dateSplit[2]);
    var hour   = parseInt(timeSplit[0]);
    var minute = parseInt(timeSplit[1]);
    var second = 0;
    var msec   = 0;

    var result = new Date(year, month, date, hour, minute, second, msec);    
    return result;
};

しかし、不思議なことに、Opera で今日の日付 (文字列 "08") を解析しようとすると、解析された整数は 0 になります。ここで、この関数は Firefox、Chrome、および Safari で期待どおりに動作することを言及する必要があります。

したがって、私の質問は次のとおりです。関数にさらにロジックを追加し、日付、月、時間、分の最初の文字が「0」で始まるかどうかを確認し、その文字を削除して、保証できるようにする必要がありますか?スクリプトが Opera でも正しく動作することを確認しますか?

これは、誰かが Opera で開発およびテストしているときに、「箱から出して」実際に機能するはずの些細なことではありませんか?

私が使用している: Opera 12.16、ビルド 1860、Mac OS X、10.9.0。

4

2 に答える 2

4

parseInt()すべての呼び出しに基数を追加します。それ以外の場合、JS は "08" を基数 8 として認識します。"8" は無効な文字であるため、解析されません。

parseInt( '08' ) == 0
parseInt( '08', 10 ) == 8

MDN ドキュメントparseInt()

入力文字列が「0x」または「0X」で始まる場合、基数は 16 (16 進数) で、文字列の残りが解析されます。

入力文字列が「0」で始まる場合、基数は 8 (8 進数) または 10 (10 進数) です。どの基数が選択されるかは、実装に依存します。

ECMAScript 5 では 10 (10 進数) を使用するように指定されていますが、まだすべてのブラウザーがこれをサポートしているわけではありません。このため、parseInt を使用するときは常に基数を指定してください。

入力文字列がその他の値で始まる場合、基数は 10 (10 進数) です。

于 2013-11-08T12:57:40.713 に答える
1

の興味深い代替手段がありますparseInt: 文字列を整数に変換し、これがどこでも絶対に機能することを本当に確認するには* ~~、JavaScript で二重のビット単位の NOT 演算子 ( ) を使用する必要があります。

~~'08' == 8

これは、実際にすべてのブラウザで動作することが保証されており、.NET よりもはるかに高速ですparseInt

*古いバージョンの IE で parseInt が正しい結果を生成しないのを見てきました

于 2013-11-08T13:19:25.973 に答える