使用date-fns库计算日期时10月结果出现偏差是什么原因?
问题根因
这个2小时偏差是夏令时(DST)时区切换导致的,和你所处的时区夏令时调整规则直接相关:
- 你初始化
startDate时用的是本地时区的日期(2020年9月1日),此时你所在的地区还处于夏令时时段,时区偏移量比UTC多1-2小时 - 加1个月到10月后,刚好跨越了夏令时结束的时间节点,欧洲、北美大部分地区的夏令时都在10月底到11月初结束,时钟会往回拨1小时,叠加你代码中先减1秒的操作,触发了时区偏移的计算差异
- 最后调用
toUTCString()将本地时间转换为UTC时间时,夏令时带来的偏移量就会直接体现在输出结果中,其他月份没有跨越夏令时切换节点,所以计算结果符合预期。
修复方案
如果需要固定按照UTC时间计算月份,全程使用UTC接口避免本地时区干扰即可:
- 初始化日期时直接构造UTC时间,不要用本地时区的日期解析
- 计算时使用date-fns提供的UTC系列方法
addUTC、subUTC替代普通的add、sub方法
修复后代码示例:
// Date.UTC的月份参数从0开始计数,8对应9月 const startDate = new Date(Date.UTC(2020, 8, 1)); endTime = addUTC(subUTC(startDate, {seconds: 1}), {months: numberOfPeriods}).toUTCString();
内容的提问来源于stack exchange,提问作者Young programmer
相关产品推荐
相关产品推荐

