使用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
相关产品推荐
相关产品推荐

