我正在解析一个字符串以检查它是否是一个日期,我们现在发现我的方法不适用于八月或九月的日期。这就是我所做的(输入不是真的硬编码,显然,但为了简洁......):
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
8
或9
。该代码适用于较低(例如"07"
)和较高(例如"10"
)整数(至少在预期日期范围内......)
我做错了什么?
答案 0 :(得分:9)
使用
parseInt(date[1], 10)
确保字符串被解释为基数10(十进制)。
否则,如果它以"0"
开头,则被解释为基数8(八进制),如果它以"0x"
开头,则被解释为基数16(十六进制)。
实际上,你应该总是包含基本参数以避免这些类型的错误。
答案 1 :(得分:1)
这是因为以0开头的数字被视为八进制数,而“08”不是八进制数,因此返回0。
阅读本文:http://mir.aculo.us/2010/05/12/adventures-in-javascript-number-parsing/
答案 2 :(得分:1)
parseInt()函数具有第二个可选的radix参数。如果省略radix参数,则JavaScript假定以下内容:
所以在你的情况下,它假定八进制数。更改为var MM = parseInt(date[1], 10);
,它将起作用
答案 3 :(得分:0)
听起来您的日期被解析为十六进制 - 前导零正在执行此操作。
因为0到7的十六进制和十进制表示相同,所以“工作”,但8和9的转换不正确。
使用
parseInt(date[1], 10)
明确指定基础。