使用moment.js防止DST转换为重复发生的事件

jdi*_*n04 5 javascript node.js momentjs

我正在构建的系统有一个事件组件,其中一部分是创建重复事件的能力.在我的数据库中,我将所有事件存储在UTC中.当用户日历上显示定期事件时,应始终以"待机时间"显示.因此,例如,如果我每周三下午1:00创建一个定期事件,无论夏令时如何,都应该始终在下午1:00.

我遇到的问题是,每当我尝试使用Moment.js格式化此日期时,Moment总是会考虑DST转换并相应地更新事件.以我在前面的例子为例,在2016年,DST转变发生在3月13日,所以如果我的预约在2016年2月被预订,那么每次预约到3月13日都会正确输出为下午1:00.3月13日之后,DST转变已经应用,我现在所有的活动都提前了一个小时.

有没有推荐的方法来处理这个?我似乎找不到让Moment"忽略"DST的方法,也没有在搜索时找到合适的解决方案.

不确定这有多重要,但我在输出日期时使用Moment Timezone转换为用户的本地时区.

谢谢!

Mag*_*int 5

作为最佳实践,未来日期应存储在当地时间.这是因为,正如评论中所指出的,时区规则可以而且确实会发生变化.因此,您无法提前正确计算当地时间的正确UTC日期.

存储未来日期时,应将其存储在用户期望事件时间所在的IANA时区中.然后,您实际上会执行与您现在正在进行的转换相反的操作.如果您需要知道事件在全球时间轴上的确切点,您可以从当地时间转换为UTC.

请注意,IANA时区数据库经常更新.它现在是2016d版本,这意味着它今年已经更新了四次.如果您的应用程序将在多个国家/地区使用,则需要非常勤奋地不断更新时刻时区以跟上变化.

至于为什么你现在看到你的UTC日期没有正确改变 - 我认为你正在计划你的预定日期,转换为UTC,然后计算你的重复发生的时间.当您使用UTC进行日期数学运算时,它将无法正确解释DST的变化,因为它不了解它们.因此,当时刻将该日期转换回本地时,它将关闭一小时.如果您要在当地时间进行日期数学运算,然后转换为UTC进行存储,那么您的转换将是正确的,并且提示时区规则没有更改.不要这样做 - 以当地时间存储日期.