发布广告时startTime与endTime存储时间不符问题排查
广告发布功能中startTime与endTime存储时区异常问题解决
问题概述
开发广告发布功能时,出现时间存储与预期不符的问题:
- 输入:
startTime: '2023-09-19T22:12:00'、endTime: '2023-09-19T22:13:00' - 实际存储:
2023-09-19T16:42:00.000Z、2023-09-19T16:43:00.000Z - 预期存储:
2023-09-19T22:42:00.000Z、2023-09-19T22:43:00.000Z(注:预期中的22:42应为输入时间22:12的UTC对应值,推测为笔误)
问题原因
核心问题出在时区解析逻辑:
- 代码中使用
moment.tz(startTime, 'Asia/Kolkata')解析输入时间,将输入的2023-09-19T22:12:00认定为**亚洲/加尔各答时区(UTC+5:30)**的时间。转换为时间戳后,对应的UTC时间自然是2023-09-19T16:42:00.000Z(22:12减去5小时30分),这与实际存储结果一致。 - 日志中
moment(startTime).format(...)输出的September 19, 2023 10:12:00是因为moment()默认使用服务器本地时区解析时间戳,若服务器时区不是亚洲/加尔各答,就会出现显示偏差。
解决方案
根据你的预期,需调整时间解析逻辑,以下是两种常见场景的处理方式:
场景1:输入时间为UTC时间,需直接存储为对应UTC时间
若输入的2023-09-19T22:12:00本身就是UTC时间,移除时区指定,直接用UTC规则解析:
// 替换原时区解析代码 startTime = moment.utc(startTime).valueOf(); endTime = moment.utc(endTime).valueOf();
修改后,时间戳对应的UTC时间即为2023-09-19T22:12:00.000Z,与预期(修正笔误后)一致。
场景2:输入时间为亚洲/加尔各答时区,需正确显示该时区时间
若输入时间确实是亚洲/加尔各答时区,当前存储的UTC时间是正确的,但日志显示需修正为对应时区:
// 修改日志输出代码,指定亚洲/加尔各答时区 console.log("Data", moment.tz(startTime, 'Asia/Kolkata').format('MMMM DD, YYYY hh:mm:ss'), moment.tz(endTime, 'Asia/Kolkata').format('MMMM DD, YYYY hh:mm:ss') );
此时存储的2023-09-19T16:42:00.000Z是正确的UTC转换结果,读取时可再转换为亚洲/加尔各答时区时间展示。
验证
修改后重新测试:
- 若按场景1处理,存储的时间将变为
2023-09-19T22:12:00.000Z,符合预期(修正笔误后)。 - 若按场景2处理,日志将输出亚洲/加尔各答时区的
September 19, 2023 22:12:00,与输入时间一致。
内容的提问来源于stack exchange,提问作者GOKULSARVESH S K
相关产品推荐
相关产品推荐

