Ubuntu环境下JS日期差计算异常:超2天差值多算1天求助
排查日期差计算多1天问题的实用思路
从你遇到的情况——Ubuntu下Chrome计算超过2天的日期差会莫名多算1天,但Windows下完全正常——结合你的时区是UTC-06:00墨西哥时区来看,大概率是夏令时(DST)或者系统与浏览器的时区不匹配在搞鬼,给你几个具体的排查和解决方向:
1. 先验证夏令时对计算的影响
墨西哥2019年的夏令时是3月10日到11月3日,你测试的7月正好在这个区间里。当创建日期对象或用Moment.js计算时,如果系统/浏览器的时区没有正确应用夏令时偏移,就会导致时间戳计算出错:
- 比如有的情况下,日期转换时会错误混淆UTC和本地夏令时时间,导致某天的时长不是严格的24小时(夏令时切换当天会有23或25小时),累积下来就会多算1天。
- 你可以在Ubuntu的Chrome里打印两个日期的
getTime()值,和Windows下的结果对比,如果差了3600000毫秒(1小时),那基本就是夏令时偏移的锅。
2. 检查Ubuntu系统和Chrome的时区是否一致
- 先看Ubuntu系统时区:打开终端输入
timedatectl,看输出的Time zone是不是America/Mexico_City(这个时区在夏令时期间是UTC-05:00,非夏令时是UTC-06:00)。 - 再查Chrome的时区设置:打开
chrome://settings/timezone,确认是自动检测时区,或者手动选了正确的墨西哥时区。 - 如果系统和浏览器时区不统一,Date对象解析时会用不同的偏移量,结果自然会错。
3. 改改计算逻辑,绕开时区/夏令时坑
不管时区问题,我们直接用UTC时间来计算,彻底避免本地时区的干扰:
原生JavaScript写法
const oneDay = 24 * 60 * 60 * 1000; // 用Date.UTC创建UTC日期,完全避开本地时区偏移 const firstDay = new Date(Date.UTC(pickUpDate[2], pickUpDate[1]-1, pickUpDate[0], 0, 0, 0)); const secondDay = new Date(Date.UTC(returnDate[2], returnDate[1]-1, returnDate[0], 0, 0, 0)); const days = Math.round((secondDay.getTime() - firstDay.getTime()) / oneDay); console.log(days);
Moment.js写法
用utc()强制转成UTC时间计算:
const Date1 = moment(pickUpDate + ' ' + phour, 'DD/MM/YYYY HH:mm').utc(); const Date2 = moment(returnDate + ' ' + rhour, 'DD/MM/YYYY HH:mm').utc(); const days = Date2.diff(Date1, 'days', true); // 传true返回小数,要整数的话可以用Math.floor或Math.round console.log(days);
这样不管本地时区怎么变,计算出来的日期差都是准确的。
4. 试试升级Chrome版本
你用的Chrome 75.0是2019年的旧版本,可能存在时区解析的bug。不妨把Ubuntu下的Chrome升级到最新版,再跑一遍测试代码,说不定问题直接就解决了。
内容的提问来源于stack exchange,提问作者Amir Alcocer May
相关产品推荐
相关产品推荐

