Luxon调用diff方法计算跨夏令时时间差结果不符问题求解
Luxon跨夏令时时间差计算偏差解决方案
偏差原因
该问题由美国纽约时区2021年11月7日的夏令时切换规则导致:当日凌晨2点会将时钟回拨1小时到1点,因此2021-11-07 01:00属于歧义时间,Luxon默认将该时间解析为冬令时生效后的第二个01:00,和起始时间的绝对毫秒差为9.5小时,和预期的挂钟时间差8.5小时不符。
仅使用diff方法的可行方案
方案1:创建时间时指定歧义时间解析规则
在创建结束时间时增加ambiguous: 'forward'参数,指定解析为夏令时生效的第一个01:00,直接调用diff即可得到正确结果:
<script src="https://cdn.jsdelivr.net/npm/luxon@1.25.0/build/global/luxon.min.js"></script> <script> startDate = luxon.DateTime.fromObject({year: 2021, month: 11, day: 06, hour: 16, minute: 30 }, { zone: 'America/New_York' }); // 新增ambiguous参数处理歧义时间 endDate = luxon.DateTime.fromObject({year: 2021, month: 11, day: 07, hour: 01, minute: 0 }, { zone: 'America/New_York', ambiguous: 'forward' }); diff = Math.abs(startDate.diff(endDate).as('hours')); console.log(diff) // 输出8.5 </script>
方案2:基于本地挂钟字段计算差值
如果歧义时间的解析逻辑无法调整,可将两个时间的本地时间字段提取后转为UTC时区再做diff,无需手动计算offset修正:
const startLocal = startDate.toObject(); const endLocal = endDate.toObject(); // 将本地时间字段直接作为UTC时间构造实例后计算差值 const diff = luxon.DateTime.fromObject(endLocal, {zone: 'utc'}) .diff(luxon.DateTime.fromObject(startLocal, {zone: 'utc'}), 'hours') .as('hours');
内容的提问来源于stack exchange,提问作者PackedUp
相关产品推荐
相关产品推荐

