那些踩过的坑之parseInt

发布于 2016-11-16 11:28 修改时间 2018-04-10 23:15 阅读数 107

本文必须得到作者授权后,方可转载,摘要引流随意。
By 依韵 , From https://blog.cdswyda.com/post/pitfall/2016/2016-11-16-parseint-hole

后台返回一个时间字符串,需要前端将其转为一个时间对象,进行一定操作。

原本时间字符串是这样的:'2016-11-16 08:08:08',之前直接使用new Date('2016-11-16 08:08:08')来创建时间对象,一看这肯定不行嘛,这东西兼容性太差,关于不同的日期时间字符串Date.parse()new Date()时的兼容性可参考:时间字符串转化兼容性 http://dygraphs.com/date-formats.html

因此就把这个改造了一下,写了一个方法来处理这个时间字符串为一个javascript中的Date对象:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
function getDate(strDate) {
    var dateArr = strDate.split(' '),
        rqArr = dateArr[0].split('-'),
        timeArr = dateArr[1].split(':');
    // 处理为数值
    $.each(rqArr, function(i, item) {
        rqArr[i] = parseInt(item);
    });
    $.each(timeArr, function(i, item) {
        timeArr[i] = parseInt(item);
    });
    console.log(timeArr);
    // 月份需要-1 因为是0-11表示1-12
    return new Date(rqArr[0], rqArr[1] - 1, rqArr[2], timeArr[0], timeArr[1], timeArr[2]);
}

现在不是通过new Date('str')来创建时间了,而是使用new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]);来创建时间。不会有兼容性问题了。

1
2
3
4
5
6
7
// IE下
getDate('2016-11-16 13:13:13');
// Wed Nov 16 2016 13:13:13 GMT+0800 (中国标准时间)

// chrome下
getDate('2016-11-16 13:13:13');
// Wed Nov 16 2016 13:13:13 GMT+0800 (中国标准时间)

好样的,没有问题!

然而,偶然情况下,在IE下居然出了问题:

1
2
3
4
5
6
7
// chrome
getDate('2016-11-16 08:08:08');
// Wed Nov 16 2016 08:08:08 GMT+0800 (中国标准时间)

// IE8
getDate('2016-11-16 08:08:08');
// Wed Nov 16 00:00:00 UTC+0800 2016

What? 时间哪去了?

经过每一步的调试分析,发现是在parseInt时出了问题。IE8"08"返回结果是0。到这里其实就已经知道问题所在了,是进制的问题。0开头的被当成了八进制。

MDN上有如下描述:

  • 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
  • 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值。
  • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。

详情请看MDN - parseInt

因此,为了保证不同环境下的转换结果,有些参数是不要随便省略的好。


Comments
Write a Comment