You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DayJS处理DD/MM/YYYY日期时获取午夜时间返回前一天的问题求助

解决DayJS处理DD/MM/YYYY日期时获取午夜时间的时区问题

问题场景

处理格式为DD/MM/YYYY的日期字符串,想要获取该日期的午夜时间,但当前代码输出了前一天的日期:

const myDate = '31/08/2023';
const midnight = dayjs(myDate, 'DD/MM/YYYY').utcOffset(0).startOf('date').toDate()
console.log(midnight) // 2023-08-30T00:00:00.000Z 

对应的DayJS对象信息:

{
  '$L': 'en',
  '$u': undefined,
  '$d': 2023-08-30T23:00:00.000Z,
  '$x': {},
  '$y': 2023,
  '$M': 7,
  '$D': 31,
  '$W': 4,
  '$H': 0,
  '$m': 0,
  '$s': 0,
  '$ms': 0
}

问题出在时区处理(当前位于英国时区,夏季为UTC+1)。

解决方案

需求1:获取本地时区的该日期午夜

如果要的是本地时间的31/08/2023 00:00:00,直接去掉utcOffset(0),先在本地时区范围内取当天起始时间:

const myDate = '31/08/2023';
const midnight = dayjs(myDate, 'DD/MM/YYYY').startOf('date').toDate();
console.log(midnight); // 输出为2023-08-30T23:00:00.000Z(对应英国本地时间31号0点)

此时toDate()输出的UTC时间会和本地时区偏移对应,但本地时间确实是目标日期的午夜。

需求2:获取UTC时区的该日期午夜

如果要的是UTC时间的31/08/2023 00:00:00,直接用dayjs.utc()方法解析日期,确保从一开始就基于UTC处理:

const myDate = '31/08/2023';
const midnight = dayjs.utc(myDate, 'DD/MM/YYYY').startOf('date').toDate();
console.log(midnight); // 2023-08-31T00:00:00.000Z

原因说明

之前的代码逻辑顺序错误:先解析成本地时间的31号0点(英国夏季为UTC+1,对应UTC时间30号23点),再设置utcOffset(0)把时区切换为UTC,此时时间变为UTC的30号23点,最后startOf('date')会把UTC时间调整到当天0点,也就是30号0点UTC,导致输出错误。调整逻辑顺序或使用UTC解析方法即可解决。

内容的提问来源于stack exchange,提问作者SosijElizabeth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:42:26