Date.parse和new Date(str)的兼容性问题

今天遇到一个怪异的BUG, 一路跟踪到isNaN(Date.parse(str))这句上,这里的意图是探测str是否是合法的日期字符串。根据MDN的定义:

The Date.parse() method parses a string representation of a date, and returns the number of milliseconds since January 1, 1970, 00:00:00 UTC.

只要是合法的日期字符串,就会返回一个UTC日期。那么要是不合法呢?MDN上有一个例子:

Date.parse('foo-bar 2014');// returns: NaN

这么看来他的做法应该是可行的,但为啥出现问题了呢?我在自己的电脑上试了下,Date.parse('foo-bar 2014')返回的是1388530800000!于是一想,前端组里好像只有我是常用Chrome的,其他人都是Firefox,难道是兼容性的问题?

于是换浏览器使劲测了测,果然如此。在Firefox中,字符串中只要出现非日期字母就会立即判定为非法日期字符串,而在当前版本的Chrome中,只要字符串最后的那部分是数字,并且和前面有空格分隔,Date.parse就会取空格和数字部分,并按这个部分给出一个日期。于是在Chrome下,Date.parse('foo-bar 2014')Date.parse(' 2014')所得的结果是一致的。但如果数字前面不是空格,如'foo-bar-2014,则会同Firefox一样返回NaN。

WebKit系内核的safari没有这个问题,行为与Firefox一致。其他浏览器则还没来得及测,有windows的朋友可以试试IE的结果。

这是我第一次遇到这样的问题,也提醒自己尽管现代浏览器已经越来越标准化了,兼容性的问题还是会在某些不起眼的地方出现,给你埋下一个又一个难以察觉的坑。


上一篇文章中说的就有一种方法将日期转为毫秒数的Date.parse(),同样测试后在移动端浏览器都显示为NAN,不能正常使用,继续探寻新的方法。

对于new Date(str);

在页面中,我们使用了一个时间组件,但是发现在Firefox下是无法正常工作的,同样在移动端浏览器也是不识别的,返回结果都是NAN,但是在Chrome下是可以正常运行的。 问题出在哪里呢?

1. 正确的做法


[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. var time1 = (timestart+' 00:00:00').toString();  
  2. var time2 = (timeend+' 23:59:59').toString();  
  3. timestart = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();  
  4. timeend = new Date(Date.parse(str.replace(/-/g,"/"))).getTime();  
  主要的变化是对默认的日期格式进行了转换, 基于'/'格式的日期字符串,才是被各个浏览器所广泛支持的,‘-’连接的日期字符串,则是只在chrome下可以正常工作。

2. 知识点总结

   '2015-05-04'是无法被各个浏览器中,使用new Date(str)来正确生成日期对象的。 正确的用法是'2015/05/05'.


  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老虎帅呆了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值