dayjs isSameOrAfter方法不符合预期,求原因排查及解决办法
dayjs isSameOrAfter 日期比较异常问题解析
问题代码
console.log(dayjs('2023-06-11T23:40:00.000Z').isSameOrAfter(dayjs('2023-06-12T13:40:00.000Z'), 'day'))
原因分析
你预期返回false但实际可能返回true,核心问题出在时区差异:
- dayjs默认用本地时区解析UTC时间,
2023-06-11T23:40:00.000Z转换到东八区(UTC+8)是2023-06-12 07:40:00,本地日期为6月12日; - 另一个时间
2023-06-12T13:40:00.000Z转换到东八区是2023-06-12 21:40:00,本地日期同样是6月12日; - 当以
'day'为单位比较时,dayjs会基于本地日期判断两者属于同一天,因此isSameOrAfter返回true。
解决方法
有两种可靠的修正方式:
1. 使用UTC模式创建日期对象
直接用dayjs.utc()生成UTC时区的日期实例,比较时基于UTC日期判断:
console.log(dayjs.utc('2023-06-11T23:40:00.000Z').isSameOrAfter(dayjs.utc('2023-06-12T13:40:00.000Z'), 'day'))
2. 开启严格UTC比较
在isSameOrAfter方法中传入第三个参数true,强制使用UTC时区进行比较:
console.log(dayjs('2023-06-11T23:40:00.000Z').isSameOrAfter(dayjs('2023-06-12T13:40:00.000Z'), 'day', true))
这两种方式都会让两个UTC时间按原始UTC日期比较,最终返回你预期的false。
内容的提问来源于stack exchange,提问作者shifoc
相关产品推荐
相关产品推荐

