那些踩过的坑之parseInt
后台返回一个时间字符串,需要前端将其转为一个时间对象,进行一定操作。
原本时间字符串是这样的:'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
对象:
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]]]]]);
来创建时间。不会有兼容性问题了。
// 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下居然出了问题:
// 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
因此,为了保证不同环境下的转换结果,有些参数是不要随便省略的好。
Last modified on 2016-11-16