2012-06-25 33 views
3

我有一个包含格式为YYYY-MM-DD的日期的对象。这个javascript日期解析有什么问题?为什么js恨8号?

我正在提取各种年,月和日整数,所以我可以将它们发送到不同的API

这里是我的方法的例子,使用substr()

演示:http://jsfiddle.net/AppSynergy/tELsw/

OK,它的工作原理。不好了! - 它没有 - 不完全......第三个元素有什么问题,其中4月8日的“08”决定为0?

如果我将“08”更改为另一个整数,例如“03”,没关系。但“08”导致问题..

这一个是让我发疯 - 怎么了?

如果你能发现它,你应该得到冰淇淋。

+3

尝试在看看这个问题: http://stackoverflow.com/questions/850341/workarounds-for-javascript-parseint-octal-bug – Bogdan

+1

'08'被解析为八进制,而不是十进制。这就是为什么我们应该用parseInt()'来使用基数。 –

+1

有趣的是,IE9是我测试的唯一浏览器,它遵循[ES5.1规范正确](http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.2)和'parseInt( “08”)'result in'8' – Esailija

回答

7

08默认情况下被视为(无效)octal文字。

你必须明确地规定,为了在您的来电parseInt()的基数此令牌被视为十进制(基数为10)号:

$("#debug").append(parseInt(date.substr(5, 2), 10) + "/"); 
+0

OMG ..八进制默认?我会**从来没有**想过这个!添加10的特定基数可以完美解决问题 - 感谢Frédéric和其他评论! - 一个 –

2

如果字符串以“0”开头,JavaScript会认为基数是八(八进制)。

你需要告诉的JavaScript由10

$.each(testData, function(i, val) { 
    // sort out the date format 
    var date = val.trim(); 
    $('#debug').append(date+' ==><br />'); 
    $('#debug').append(parseInt(date.substr(0, 4), 10)+'/'); 
    $('#debug').append(parseInt(date.substr(5, 2), 10)+'/'); 
    $('#debug').append(parseInt(date.substr(8, 2), 10)+'<br /><br />'); 
}); 
3

您需要使用parseInt10基数/基地自前0你的电话号码转换八进制基地解析字符串。

parseInt(yourNum, 10); 

因为这一原因的,事实证明,当使用parseInt,除非你是不是在基地10数字的工作,你应该总是指定基地。