在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 库吧。