防止DST与moment.js轮换事件转移

我正在build立的系统有一个事件组件,其中的一部分就是创build循环事件的能力。 在我的数据库中,我使用UTC存储所有事件。 当用户的日历上显示重复事件时,应始终显示在“墙上时间”中。 因此,例如,如果我每周三下午1:00创build一个周期性事件,无论夏时制是否变化,都应该始终在下午1:00。

我遇到的问题是,每当我尝试使用Moment.js格式化此date时,Moment始终占用DST转换并相应地更新事件。 以我之前的例子为例,2016年3月13日DSTclass次发生,所以如果我的预约是2016年2月预定的,那么到3月13日为止的每个预约都会正确输出为下午1:00。 3月13日之后,DSTclass次已经实施,我所有的活动现在都在一个小时之前。

有一个build议的方式来处理这个? 我似乎无法find一种方法让Moment“忽略”DST,也没有find适当的解决scheme。

不知道这是多么重要,但我输出date时使用Moment时区转换到用户的本地时区。

谢谢!

       

网上收集的解决方案 "防止DST与moment.js轮换事件转移"

作为最佳做法,将来的date应该在当地时间存储。 这是因为,正如评论中指出的那样,时区规则可以并且确实会改变。 因此,您无法正确计算当地时间的正确UTC时间。

当您存储将来的date时,应该将其与IANA时区一起存储,以便用户预期事件发生时间。然后,您实际上将执行与您现在正在执行的转换相反的操作。 如果您需要知道事件在全球时间线上的确切点,您可以从本地时间转换为UTC。

请注意,IANA时区数据库会经常更新。 目前版本为2016d,这意味着它已经在今年更新了四次。 如果您的应用程序将在多个国家/地区使用,您需要非常勤奋地持续更新时刻以适应变化。

至于为什么你看到你的UTCdate不是正确的改变 – 我想你正在把你的计划date,转换为UTC,然后计算你的再次发生的时间。 当你用UTC来计算date时,它不会正确考虑到DST的变化,因为它不知道它们。 因此,当这个时刻把这个date转换回本地时,它将会closures一个小时。 如果您在当地时间进行datemath计算,然后转换为UTC进行存储,则您的转换返回将是正确的。提供时区规则没有改变。 不要这样做 – 在当地时间存储date。