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,build 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(十六进制)并解析字符串的其余部分。

如果输入字符串以“0”开头,则基数为 8(八进制)或 10(十进制)。确切选择哪个基数取决于实现。

ECMAScript 5 指定使用 10(十进制),但并非所有浏览器都支持这一点。由于这个原因,在使用 parseInt 时总是指定一个基数。

如果输入字符串以任何其他值开头,则基数为 10(十进制)。

于 2013-11-08T12:57:40.713 回答
1

有一个有趣的替代方法parseInt:将字符串转换为整数并确保这绝对适用于任何地方*您应该~~在 javascript 中使用双位非运算符 ():

~~'08' == 8

这保证在每个浏览器中都能正常工作,而且比parseInt.

*我看到 parseInt 在旧版本的 IE 中不能产生正确的结果

于 2013-11-08T13:19:25.973 回答