Moment.js时区时间对比异常排查:不同时区计算结果为何趋同?
问题分析与解决方案
你的核心问题出在没有正确解析「时间A」的时区——你想让05/31/2018 03:25:00代表America/Chicago时区的时间,但直接用moment('05/31/2018 03:25:00')时,Moment.js会默认使用你的系统本地时区(也就是你提到的PST/PDT)来解析这个字符串,之后再转时区的操作已经晚了,这就导致所有计算的基准都错了。
逐个拆解你的测试结果
结合你提到的「系统当前时间为01:25 PST」(注:5月美国处于夏令时,实际应该是PDT,不过不影响核心逻辑),以及各时区的夏令时时差(America/Chicago为CDT UTC-5,America/Los_Angeles为PDT UTC-7,America/Phoenix为MST UTC-7且无夏令时)来分析:
第一个测试结果异常的原因
moment('05/31/2018 03:25:00').tz('America/Chicago').diff(moment().tz('America/Phoenix'), 'minutes')- 前半段:
moment('05/31/2018 03:25:00')先被解析为PDT时区的05/31 03:25,再转成CDT时区就是05/31 05:25(PDT到CDT差2小时)。 - 后半段:
moment().tz('America/Phoenix')是当前时间的Phoenix时区,和PDT同UTC-7,所以是01:25 MST。 - 你得到的111分钟差值,本质还是因为时间A的解析基准错误,导致计算的时间差偏离预期。
- 前半段:
后三个测试结果一致的原因
// 测试2 moment('05/31/2018 03:25:00').tz('America/Chicago').diff(moment().tz('America/Los_Angeles'), 'minutes') // 测试3 moment('05/31/2018 03:25:00').tz('America/Chicago').diff(moment().tz('America/Chicago'), 'minutes') // 测试4 moment('05/31/2018 03:25:00').diff(moment().tz('America/Chicago'), 'minutes')- 测试2:
moment().tz('America/Los_Angeles')是当前PDT时间01:25,转成UTC后和Phoenix的01:25 MST是同一个UTC时间,所以和时间A转成UTC后的差值,与测试3中当前芝加哥时间转UTC后的差值一致(Moment.js的diff是基于UTC时间计算的)。 - 测试3和4:测试3是把错误解析的时间转成芝加哥时区后计算差值,测试4是直接用错误解析的本地时间(已基于UTC基准)和当前芝加哥时间(UTC基准)计算差值,两者本质都是基于UTC的差值,所以结果相同。
- 测试2:
正确的写法
要直接将05/31/2018 03:25:00解析为America/Chicago时区的时间,你需要使用moment.tz()方法(而非先创建本地时间再转时区),再和转换到芝加哥时区的当前时间对比:
// 正确解析时间A为芝加哥时区的时间 const timeA = moment.tz('05/31/2018 03:25:00', 'America/Chicago'); // 获取当前时间并转换为芝加哥时区 const currentChicagoTime = moment().tz('America/Chicago'); // 计算分钟差值 const diffMinutes = timeA.diff(currentChicagoTime, 'minutes');
如果你本质是想对比芝加哥时间(CDT/CST)和当前PST/PDT时间的实时分钟差,也可以这样写:
// 当前PST/PDT时间 const currentPST = moment().tz('America/Los_Angeles'); // 转换为芝加哥时区 const currentPSTInChicago = currentPST.clone().tz('America/Chicago'); // 时间A是芝加哥时区的05/31/2018 03:25:00 const timeA = moment.tz('05/31/2018 03:25:00', 'America/Chicago'); // 计算差值 const diffMinutes = timeA.diff(currentPSTInChicago, 'minutes');
这样就能保证所有时间的基准都是正确的,不会出现时区解析错误导致的偏差。
内容的提问来源于stack exchange,提问作者rajugaadu
相关产品推荐
相关产品推荐

