JS中通过Epoch时间戳比较促销时间是否可靠?如何解决冬令时问题?
问题解答
1. 现有实现是否绝对可靠?
核心逻辑是可靠的,但前提是元字段中存储的是正确的UTC时间。
因为Epoch时间戳(毫秒数)是基于UTC的绝对时间,和本地时区、夏令时/冬令时完全无关。你的代码里:
Date.now()直接返回当前UTC时间的毫秒数new Date(带时区的ISO字符串).getTime()会正确解析UTC时间并转换为对应的Epoch戳
只要元字段的时间格式是标准的带UTC偏移的ISO字符串(比如2022-12-02T13:00:00+00:00),且数值是你预期的UTC时间,那么比较逻辑不会受冬令时/夏令时影响。你需要手动减1小时的问题,本质是元字段里的时间没有正确对应到你实际想要的UTC时间(比如你误把本地时间当成UTC时间填进去了)。
2. 如何通过代码解决冬令时问题?
方案一:修正元字段存储逻辑(推荐)
确保元字段存储的是目标时间对应的UTC时间,而不是本地时间。比如:
- 如果你想让促销在本地时间13:00开始,且当前本地时区是UTC+1(冬令时),那么对应的UTC时间是12:00,元字段应填
2022-12-02T12:00:00+00:00 - 夏令时本地时区变为UTC+2时,本地13:00对应UTC11:00,元字段填
2022-12-02T11:00:00+00:00
这种情况下,现有代码不需要修改,比较逻辑自然正确,完全规避冬令时问题。
方案二:代码中处理时区转换(如果元字段只能存本地时间)
如果元字段必须存储本地时间(不带时区),可以在代码中将其转换为UTC时间后再生成Epoch戳。比如假设元字段存的是运营者所在时区的时间,你可以手动指定时区转换:
// 示例:假设元字段存的是"2022-12-02T13:00:00"(本地时间,时区为Europe/Amsterdam) const localTimeStr = response.data.shop.promotion_start.value; // 解析为指定时区的Date对象 const startDate = new Date(new Date(localTimeStr).toLocaleString('en-US', { timeZone: 'Europe/Amsterdam' })); const startPromotionEpoch = startDate.getTime(); // 当前时间直接用Date.now() const currentEpoch = Date.now(); const endPromotionEpoch = new Date(new Date(response.data.shop.promotion_end.value).toLocaleString('en-US', { timeZone: 'Europe/Amsterdam' })).getTime(); if(currentEpoch > startPromotionEpoch && currentEpoch < endPromotionEpoch) { // website updates }
但这种方案依赖于硬编码时区,不如直接存储UTC时间可靠,因为时区规则可能会调整(比如部分地区取消夏令时)。
代码简化建议
现有代码里new Date(Date.now()).getTime()完全可以简化为Date.now(),因为Date.now()本身就返回当前时间的UTC毫秒数,无需额外转换。
内容的提问来源于stack exchange,提问作者Mathijs Delva
相关产品推荐
相关产品推荐

