求助:Moment.js转UTC日期2018-03-31T00:00:00.000Z到EST得30号,如何得到31号?
问题原因分析
你得到2018-03-30是完全符合时间转换逻辑的,核心原因在于时差和夏令时规则:
- 2018年美国东部夏令时(EDT)从3月11日开始,到11月4日结束,这段时间东部时间比UTC晚4小时;而冬令时(EST)才是比UTC晚5小时,3月31日显然处于夏令时周期内。
- 你输入的UTC时间
2018-03-31T00:00:00.000Z,对应的东部夏令时时间是2018-03-30T20:00:00,日期自然落在3月30日。
如何得到东部时间的2018-03-31?
如果你确实需要转换后输出2018-03-31,可以参考以下两种方案:
1. 调整输入的UTC时间
要对应东部时间3月31日00:00及之后的时刻,输入的UTC时间需要是2018-03-31T04:00:00.000Z(因为EDT比UTC晚4小时)。用Moment.js实现的代码示例:
const moment = require('moment-timezone'); // 输入对应EDT 2018-03-31 00:00的UTC时间 const targetUtcDate = '2018-03-31T04:00:00.000Z'; const estDate = moment.utc(targetUtcDate).tz('America/New_York').format('YYYY-MM-DD'); console.log(estDate); // 输出 2018-03-31
2. 转换逻辑调整(适配“UTC日期31号对应东部日期31号”的需求)
如果你的需求是“把UTC的3月31日这一天,映射为东部时间的31号”,可以取UTC当天的晚些时间点(比如UTC 3月31日23:59)来转换:
const moment = require('moment-timezone'); const utcDateEnd = '2018-03-31T23:59:59.000Z'; const estDate = moment.utc(utcDateEnd).tz('America/New_York').format('YYYY-MM-DD'); console.log(estDate); // 输出 2018-03-31
关键注意事项
- 不要直接使用固定的
EST时区标识,优先用America/New_York时区——Moment-timezone会自动识别夏令时/冬令时的切换,避免因时区规则错误导致转换偏差。 - 时刻明确:UTC与东部时间的时差会随季节变化,转换时必须考虑夏令时的影响,不能用固定的5小时差值计算。
内容的提问来源于stack exchange,提问作者Ayus
相关产品推荐
相关产品推荐

