最近开发项目时,业务代码中有一段比较两个时间点相距是否超过3个月的逻辑,当时的条件判断语句我是这样写的:
var sendDate = "2019-06-07 10:07:32";
if (Date.now() - new Date(sendDate).getTime() < 7776000000) {
// 具体业务逻辑
}
然后在测试的时候,我发现这段逻辑在Chrome是正常运行的,但在IE浏览器下运行结果和Chrome不一致而且也跟我的预期结果不符,于是我修改代码变成下面这样
var sendDate = "2019-06-07 10:07:32";
console.log("time: ", new Date(sendDate ).getTime());
console.log("timeDiff: ", Date.now() - new Date(sendDate).getTime() < 7776000000);
if (Date.now() - new Date(sendDate).getTime() < 7776000000) {
// 具体业务逻辑
}
我在执行这段代码的时候,当前系统时间是2019年6月8日15点左右,if语句的结果应该是true,会执行条件语句中的逻辑,且第一个输出语句应该是具体的时间戳,第二条输出的应该是true。然后我分别在Chrome浏览器和IE浏览器下执行
这是Chrome的运行结果:
下面是IE的运行结果
可以看出来在IE下通过new Date(“2019-06-07 10:07:32”).getTime()得到的结果是不符合预期的NaN,也就导致了if条件语句的结果是false,而且这种现象在老版的Firefox也出现了。
在网上查阅了相关资料之后,发现对于我调用Date构造函数时,对传入其中的参数会有一些要求,如果输入的日期格式不是标准的日期格式,会导致在不同浏览器中得到的结果不同。当我修改代码为下面的样子:
var sendDate = "2019-06-07 10:07:32";
sendDate = sendDate.replace(/-/g, "/"); // 得到2019/06/07 10:07:32
console.log("time: ", new Date(sendDate ).getTime());
console.log("timeDiff: ", Date.now() - new Date(sendDate).getTime() < 7776000000);
if (Date.now() - new Date(sendDate).getTime() < 7776000000) {
// 具体业务逻辑
}
再到IE浏览器和旧版本的Firefox下运行时,结果就是我想要的了
从这个现象我们可以看出来,其实基于"/“格式的日期字符串,才是各个浏览器所广泛支持的,而”-"连接的日期字符串,则只有在新版的Chrome、Firefox、Safari等浏览器支持,即便是最新的IE浏览器也不支持。所以当我们在业务中涉及到对日期通过new Date获取具体信息时,记得要把具体日期的格式转化为"xxxx/xx/xx xx:xx:xx",这种格式才能在各个浏览器中都被支持,无兼容性问题