【发布时间】:2018-04-22 13:58:21
【问题描述】:
我现在不在我的代码面前,但我真的认为我不需要它来问这个问题。所以我有一个倒数计时器,它每 18 小时关闭一次,然后重置。计时器检查当前的DateTime.Now 并根据需要调整倒计时计时器。我在尝试将夏令时倒退一小时时遇到问题,因为;例如,2017 年 11 月 5 日凌晨 2 点的过去事件会回到凌晨 1 点,但是当我这样做时 DateTime.IsDaylightSavingTime() 它告诉我这是错误的,即使夏令时刚刚结束。这使我的计时器额外返回一个小时,因为它认为夏令时在那一小时内仍然没有发生。我该如何解决这个问题?
【问题讨论】:
-
不检查当前时间,倒计时。使用具有预定义间隔的计时器来减少计数器,当它达到零时,您就完成了。例如,设置一个以 18 小时为单位的秒数的变量和一个以 1 秒为间隔的计时器。这完全避免了了解系统时间的需要,并且可以随意更改而不会干扰您的系统。
-
DateTime.UtcNow没有这个问题。例如,如果有人决定时钟关闭 18 小时并将时间设置为其他时间,它仍然会中断。 -
@Alejandro,我需要使用系统时间,因为我的计时器需要基于它。因此,如果我的应用程序关闭并重新打开,它可以获取当前时间并调整倒数计时器所需的时间。如果这有意义的话。
-
@JeroenMostert 我通过检查本地时间和 UtcNow 之间的时差来调整时区变化。如果差异发生变化,我会调整计时器,因为我认为发生了时区。当 DST 发生并返回一小时时,我的本地时间和 UtcNow 之间的偏移量会更改 -1。这使它认为发生了时区更改,并且当我不希望它发生时,我的计时器会失去一个小时。如果我能够检测到 1 小时内 DST 是否为假,我可以忽略时区更改“事件”。问题是我无法知道该小时是否是夏令时。
-
如果您在所有计算中始终使用
UtcNow,则无需进行任何调整。如果“每 18 小时”的意思不是“每 64800 秒”,那么您的问题并不清楚。 (顺便说一句,UTC 是一个好主意的全部原因在于,一般来说,如果没有上下文,就不可能说出您是否处于重复的小时内。对于将本地时间存储为的数据库系统来说,这是一个问题好吧。)