为何JavaScript中两种方式创建的Date日期值不一致?
为什么通过毫秒数调用JavaScript Date的结果不一样?
哈哈,这个坑很多刚接触JS的同学都会踩!核心原因是你用了两种完全不同的Date调用方式,咱们掰扯清楚:
两种调用的本质差异
new Date(ms):这是正经的构造函数调用,会生成一个Date对象,它会严格根据你传入的时间戳(从1970-01-01 UTC起算的毫秒数)计算对应的日期时间,完全符合你的预期。Date(ms):这是普通函数调用,不管你传什么参数进去,它都会直接返回当前系统的本地时间字符串,传入的时间戳直接被忽略了!
哪一个结果是正确的?
new Date(1524862189829)的结果才是对的!咱们验证下这个时间戳:
把1524862189829转成UTC时间是2018-04-27T20:49:49.829Z,对应太平洋夏令时(GMT-0700)就是你看到的Fri Apr 27 2018 13:49:49 GMT-0700 (Pacific Daylight Time),完全匹配时间戳。
而Date(1524862189829)返回的是你调用这个函数瞬间的本地时间——你当时调用它的时候是4月30日15:29:44,所以它就返回了那个时间,和你传的毫秒数半毛钱关系都没有。
用代码实锤验证
你可以跑这段代码确认:
const ms = 1524862189829; const d0 = new Date(ms); // 基于时间戳生成的Date对象 const d1 = Date(ms); // 返回当前时间的字符串 const currentNow = new Date().toString(); // 获取调用时的当前时间 console.log(d0.toString()); // 输出时间戳对应的正确日期 console.log(d1 === currentNow); // 会打印true,证明d1就是当前时间
最后划重点
- 如果要根据时间戳创建日期,必须用
new Date(时间戳)的构造函数写法 - 直接调用
Date()(不管传不传参数)都是返回当前本地时间的字符串,参数直接被无视
内容的提问来源于stack exchange,提问作者Kuan
相关产品推荐
相关产品推荐

