algorithm - 确定日期是否在 DST 中的高效算法

标签 algorithm datetime timezone dst

我正在寻找一种比 O(n) 算法更好的算法来确定 future 的某个日期是否会应用夏令时(以及多少)。给定年、月、日、小时、分钟和时区(以及奥尔森时区数据库的副本),如何有效地确定该日期是否采用夏令时?我正在寻找算法,而不是要调用的库函数。

谢谢。

进一步说明:当您创建具有 future 日期和时区的对象时,我使用的日期库非常慢。事实证明它进行线性计算来计算日期是否在夏令时。不仅如此,它在对象创建时这样做。显然它可以等到被问到,但它也应该更有效率。

当然,DST 规则会改变,日期库无法预测 future ,但替代方法是对本地化日期设置任意上限。

最佳答案

每个人都已经对不断变化的 DST 的问题发表了评论。但我可以接受这样的前提,即我们只是假装当前已知的规则将永远适用。

要获取您的 DST 信息,首先要做的是计算您 future 日期的年/月/日(如果它尚未采用那种形式)。然后您查找您的时区并提取与 UTC 的差异、DST 开/关规则和偏移量。根据年份的不同,可能会有几种不同的规则,您希望确保为您的“目标”年份捕获正确的规则。由于下面解释的原因,了解前一年的规则可能会很方便。

开/关规则会有一个有趣的规范,如“Oct lastSun”:这意味着切换发生在十月的最后一个星期日晚上。

您需要做的是收集所有这些格式简洁的“规则”并为每个规则开发一些代码以确定该规则指示的最后日期。现在是 12 月,所以根据我的时区的一些规则,例如“Mar lastSun”和“Oct lastSun”,这些日期将是 2009 年 3 月 29 日和 2009 年 10 月 25 日。这些日期中哪个日期最近?十月。十月与“休假”相关联,因此我们目前必须没有夏令时。

无论目标日期是在这些日期之前还是之后,您都可以计算当前(即目标)年份的夏令时开/关日期;如果开/关日期在您的目标日期之后,则只需对前一年再次进行规则计算。请注意,规则可能会在此期间发生变化,因此请务必为您正在查看的年份应用正确的规则。

此计算的最坏情况是,您必须重复前一年的两个规则计算。但除此之外不会进行任何搜索,因此严格来说是 O(1)。

我在这里找到了一个 Local/DST/Tz 计算器:http://home-4.tiscali.nl/~t876506/WhatDay.html由于它是一个 JavaScript 小程序,您应该能够简单地抄写代码。不过,它不会处理所有规则,因此您需要为其余规则添加一些代码。


更新:我刚刚注意到您也有一个小时和一分钟的时间。这让事情稍微复杂了一点。如果您的日期不在“转换”日期,那么我上面给出的说明对您来说没问题。否则,你需要考虑时间。我想最干净的做法是将时间包括在您对“最近”的确定中。 IE。如果您的目标时间是 00:30 UTC,而给定区域的切换时间是 01:00,则目标年份的切换时间仍然是 future ,您必须改用上一年的切换时间。出于实际目的,这意味着“其他”切换时间是最近的,并且它的开/关状态适用。

关于algorithm - 确定日期是否在 DST 中的高效算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912302/

相关文章:

c - 基本的简单分词器

algorithm - Uva 10252,看不懂

r - 如何按组计算 data.frame 与前一行的时间差

python - 将格式化的时间字符串转换为毫秒

ruby-on-rails - 带时区的Strptime

algorithm - 对列表的两个列表设置操作

algorithm - 我的梯度下降算法有什么问题

java - 日历无法正确设置小时

c# - 按州/省和国家/地区获取时区?

c# - 将时区格式的日期时间转换为本地日期时间