写点什么

日期格式化 YYYY-MM-DD 出现时间偏移量

作者:HoneyMoose
  • 2022-12-02
    美国
  • 本文字数:829 字

    阅读完需:约 3 分钟

在 js 中,很多时候需要把日期字符串转换为一个 Date 对象。

如果得到的日期字符串有时间还好办,如果没有时间,只有日期的格式,例如 2022-12-01 这样的字符串呢?

大部分人可能什么都没想,直接就调用了 new Date(datestring)。可是事情没有想象中那么简单。

 


发现了问题了吗?获得日期时间被减去了 5 个小时。

这是因为我们的浏览器在美国东部时间。

在 MDN 中,有一个下面的注释:

Note: When parsing date strings with the Date constructor (and Date.parse, they are equivalent), always make sure that the input conforms to the ISO 8601 format (YYYY-MM-DDTHH:mm:ss.sssZ) — the parsing behavior with other formats is implementation-defined and may not work across all browsers. Support for RFC 2822 format strings is by convention only. A library can help if many different formats are to be accommodated.
Date-only strings (e.g. "1970-01-01") are treated as UTC, while date-time strings (e.g. "1970-01-01T12:00") are treated as local. You are therefore also advised to make sure the input format is consistent between the two types.
复制代码

 


不要忽略掉上面的这个注释。

用人话解释一下就是,如果直接给 new Date 传入’YYYY-MM-DD’ 这样的字符串作为参数的话,得到的 Date 对象是一个基于 UTC 的对象实例。

如上面的代码实例中,

const date2 = new Date('2022-12-01')

date2 在进行实例化的时候,得到的是 2022-12-01 00:00:00 GMT+00:00 这样的时间,再被转换美国的东部时区的时候,就少了 5 个小时。

问题解决

要解决这个问题,其实就使用了 moment 来对日期进行格式化就可以了。

moment('2022-12-01').toDate();

使用上面的代码,就可以避免在 new Date() 进行日期格式化的时候因为时区的问题导致的时间便宜。

这个便宜有可能会导致多一天或者少一天的情况。

处理日期,还是尽量使用 moment 库吧。

https://www.ossez.com/t/yyyy-mm-dd/14233

用户头像

HoneyMoose

关注

还未添加个人签名 2021-03-06 加入

还未添加个人简介

评论

发布
暂无评论
日期格式化 YYYY-MM-DD 出现时间偏移量_HoneyMoose_InfoQ写作社区