2

重複の可能性:
JavaScriptparseIntの8進数バグの回避策

文字列を解析して日付かどうかを確認していますが、偶然にも、このメソッドが8月または9月の日付では機能しないことがわかりました。これは私がしていることです(入力は実際にはハードコーディングされていませんが、簡潔にするために...):

var str = '2010-08-26 14:53';
var data = str.split(' ');  // ['2010-08-26', '14:53']
var date = data[0].split('-'); // ['2010', '08', '26]
var time = data[1].split(':'); // ['14', '53']

var yyyy = parseInt(date[0]); // 2010

// THIS IS WHERE STRANGE THINGS HAPPEN:
var MM = parseInt(date[1]); // 0 - not 08 or 8, as expected!
console.log(date[1]); // prints "08" (with quotes)
console.log(date[1].toString()); // prints 08 (no quotes)
console.log(parseInt(date[1].toString())); // prints 0 (!)

この問題は、8月と9月、および毎月8日と9日に発生します。つまり、"08"または"09"が整数に解析されているときに、または0の代わりに返されます。このコードは、より低い( eg)整数とより高い(eg )整数の両方で機能します(少なくとも予想される日付範囲内で...)89"07""10"

私は何が間違っているのですか?

4

4 に答える 4

9

使用する

parseInt(date[1], 10)

文字列が基数 10 (10 進数) として解釈されるようにします。

それ以外の場合、 で始まる場合は基数 8 (8 進数) として解釈され、 で始まる場合"0"は基数 16 (16 進数)として解釈され"0x"ます。

実際、この種のバグを避けるために、常にbase 引数を含める必要があります。

于 2010-07-27T09:00:36.520 に答える
1

これは、0で始まる数値は8進数として扱われ、「08」は8進数ではないため、0が返されるためです。

これを読んでください:http://mir.aculo.us/2010/05/12/adventures-in-javascript-number-parsing/

于 2010-07-27T09:02:18.707 に答える
1

parseInt() 関数には、2 番目のオプションの基数パラメーターがあります。基数パラメーターが省略されている場合、JavaScript は次のように想定します。

  • 文字列が「0x」で始まる場合、基数は 16 (16 進数)
  • 文字列が「0」で始まる場合、基数は 8 (8 進数) です。この機能は非推奨です
  • 文字列が他の値で始まる場合、基数は 10 (10 進数) です。

したがって、あなたの場合、8進数を想定しています。に変更するvar MM = parseInt(date[1], 10);と動作します

于 2010-07-27T09:06:51.867 に答える
0

日付が16進数として解析されているようです。先行ゼロがこれを行っています。

16進数と10進数の表現は、0〜7で同じであるため、「機能します」が、8と9は正しく変換されません。

使用する

parseInt(date[1], 10)

ベースを明示的に指定します。

于 2010-07-27T09:05:00.560 に答える