JavaScript Date.parse里的坑

在做 FreeCodeCamp 的一个练习,题目要求能够接收用户输入的时间参数,返回一个 json 文件,包括 unix 时间戳和自然语言的表示。

使用示例:
https://timestamp-ms.herokuapp.com/December%2015,%202015
https://timestamp-ms.herokuapp.com/1450137600

输出示例:
{ "unix": 1450137600, "natural": "December 15, 2015" }

查询 Date 函数发现构造函数既可以接收时间戳为参数,也可以接收自然语言的字符串。

> new Date('December 15, 2015')
Tue Dec 15 2015 00:00:00 GMT+0800 (CST)
> new Date(1450137600*1000)
Tue Dec 15 2015 08:00:00 GMT+0800 (CST)

然而他们得到的时间却相差了8个小时,查了下,在 Date.parse 的文档里发现了这么一段:

Given a string representing a time, parse()
returns the time value. It accepts the RFC2822 / IETF date syntax (RFC2822 Section 3.3), e.g. "Mon, 25 Dec 1995 13:30:00 GMT"
. It understands the continental US time zone abbreviations, but for general use, use a time zone offset, for example, "Mon, 25 Dec 1995 13:30:00 +0430"
(4 hours, 30 minutes east of the Greenwich meridian). If a time zone is not specified and the string is in an ISO format recognized by ES5, UTC is assumed. However, in ECMAScript 2015 ISO format dates without a timezone are treated as local.

如果输入的是字符串作为构造函数,且没有指定时区的话,会默认用当地时区,而 JavaScript 并没有提供指定时区的方法,于是只能曲线救国,先转成时间戳,把偏差的时间加上,再转回 Date 对象。

> d = new Date('December 15, 2015')
Tue Dec 15 2015 00:00:00 GMT+0800 (CST)
> d1 = new Date(1450137600*1000)
Tue Dec 15 2015 08:00:00 GMT+0800 (CST)
> d = new Date(d.getTime()-1000*60*d.getTimezoneOffset())
Tue Dec 15 2015 08:00:00 GMT+0800 (CST)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,268评论 19 139
  • 一直被各种时间格式困扰,所以这次来总结一下常用的时间格式到底有哪些,它们之间如何互相转换。 ISO Date "...
    吃柠檬的刺猬阅读 11,227评论 0 3
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,308评论 6 13
  • 我喜欢你是活泼的 大声地唱情歌 大口地吃东西 大方地买衣服 不顾焦虑地贪玩 这时的你怎么了 闷着,坐在床上思考十七...
    倩何人换取阅读 284评论 0 3
  • 晚上在简书上看了一篇我认为比较好的文章,便推荐给lg看。我的目的很明确,希望他看了这篇文章后能拾起笔重新开始写作,...
    明月书心堂阅读 413评论 2 3