2012-06-25 31 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數字的工作,你應該總是指定基地。