date-fns的parse方法解析yyyyMMdd格式日期返回前一天该如何解决?
问题根因
date-fns的parse方法默认以本地时区解析输入的日期字符串,你例子中的输入20210119会被解析为本地时区的2021年1月19日0点,而控制台打印的2021-01-18T23:00:00.000Z是UTC标准时间,对应你所在时区为UTC+1,所以本地0点换算为UTC时间就会显示为前一天的23点,本质是时区换算导致的显示偏差,不是解析逻辑错误。
解决方案
方案1:使用UTC模式解析日期(推荐)
如果你需要解析得到的日期UTC时间和输入的日期完全对齐,直接使用date-fns提供的parseUTC方法即可,该方法会以UTC时区为基准解析字符串:
import { parseUTC } from 'date-fns' var start ="20210119"; const dateFrom = parseUTC(start, "yyyyMMdd", new Date()); console.log("date form",dateFrom); // 输出为2021-01-19T00:00:00.000Z
方案2:按本地时区格式化输出日期
如果你的业务逻辑本身就是基于本地时区处理日期,不需要对齐UTC时间,只要最终输出的日期字符串正确即可,不要直接打印Date对象,使用format方法按需求格式化本地时间:
import { parse, format } from 'date-fns' var start ="20210119"; const dateFrom = parse(start, "yyyyMMdd", new Date()); console.log("formatted date", format(dateFrom, 'yyyy-MM-dd')); // 输出为2021-01-19
方案3:手动修正时区偏移(不推荐,仅作兼容参考)
如果受版本限制无法使用parseUTC,可以手动计算时区偏移量修正解析结果:
var start ="20210119"; const dateFrom = parse(start, "yyyyMMdd", new Date()); // 加上本地时区和UTC的时差偏移 dateFrom.setTime(dateFrom.getTime() + dateFrom.getTimezoneOffset() * 60 * 1000); console.log("date form",dateFrom); // 输出为2021-01-19T00:00:00.000Z
内容的提问来源于stack exchange,提问作者P_R
相关产品推荐
相关产品推荐

