DateTimeOffset如何处理夏令时?

时间:2011-09-26 10:53:06

标签: c# scheduling datetimeoffset nodatime

我知道DateTimeOffset存储UTC日期/时间和偏移量。我也从this MSDN blog entry知道DateTimeOffset应该用于“使用夏令时”。

我正在努力理解的是DateTimeOffset“夏令时”的工作原理。我的理解,很少有,是夏令时是一个政治决定,不能从纯粹的抵消推断。如果它只存储一个偏移量,那么这个结构如何才是DST友好的呢?

我认为可能有一种方法可以将TimeZoneInfo类与DateTimeOffset结合使用。我该怎么做?

最后,有什么更好的方法可以实现以下目标吗?

(我看过Jon Skeet关于Noda-Time的一些帖子,但我认为它尚未准备好生产,我不知道它是否能很好地融入我们现有的解决方案。)

这是我们的方案。该服务器是出于在英国时间运行的不幸遗留原因。我们的客户开始从澳大利亚投入运营,其中有多个时区。其他国家可以随时投入使用。

我们有一个基于Hardcodet scheduler的调度程序(使用DateTimeOffset)。它工作得很好。但是,在我们的数据库中,我们只存储足够的数据来构造DateTime对象(见下文),在我们的子类和管道代码中我们只使用DateTime,因为最初我们只支持英国用户。

该调度程序负责固定和动员工厂设备。因此,预定事件在用户的DST调整后的当地时间运行至关重要。

用户在我们的网站上输入时间表;目前,它作为星期几,小时和分钟存储在数据库中。当读取数据时,我们为该日,小时和分钟的下一次出现创建一个DateTime对象。我可以自由地改变db结构以另外存储偏移量或时区。

当该日期和时间到达时,调度程序发送命令(并重试一段时间)。它然后在下周的同一天和时间再次运行(尽管该服务实际上已经被回收,代码将再次运行)。

所有我需要实现的是使用调度程序从Hardcodet子类调度,在该时间段调整本地日期和时间的调度事件。如果DateTimeOffset确实是DST感知的,那么我需要做的就是存储一个偏移并改变我们的管道代码以使用这个结构,但我得到的印象并不是那么简单。 (我们或许可以从工厂的GPS位置获取当前时区,但这是另一天的讨论:))。

1 个答案:

答案 0 :(得分:26)

DateTimeOffset本身并不真正支持DST,但TimeZoneInfo是。DateTimeOffsetDateTimeOffset表示固定的即时时间 - 因此您可以通过时区感知的内容获取 DateTimeOffset。换句话说,如果我现在在英国要求DateTimeOffset,我最终会得到与UTC相差+1小时的内容。如果我在12月份在英国要求DateTimeOffset一段时间,我最终会得到与UTC相差0小时的内容。

如果您更改数据库以包含偏移量,则可以从用户选择的DateTime(应该是“未指定的”)创建{{1}}并将其时间设置为区域,那么应该考虑到DST,给你正确的偏移量。

有一件事需要注意:如果我现在为“2年时间”安排一些事情并且你现在确定了偏移量,那么的偏移量将来可能不正确 - 例如,当DST适用时,政府可能会改变,显然这不会改变数据库中存储的内容。