每个人都已经对不断变化的 DST 的问题发表了评论。但我可以接受我们只是假装目前已知的规则将永远适用的前提。
要获取您的 DST 信息,首先要做的是计算您未来日期的年/月/日(如果尚未采用该格式)。然后您查看您的时区并提取与 UTC、DST 开/关规则和偏移量的变化。取决于哪一年,可能会有几种不同的规则,您要确保为您的“目标”年份选择正确的规则。由于下面解释的原因,了解上一年的规则可能会很方便。
开/关规则会有一个有趣的规范,比如“Oct lastSun”:这意味着切换发生在 10 月的最后一个星期日的晚上。
您需要做的是收集所有这些格式简洁的“规则”,并为每个规则开发一些代码以确定该规则指示的最后日期。目前是 12 月,因此考虑到我所在时区的“Mar lastSun”和“Oct lastSun”等一些规则,这些日期将是 2009 年 3 月 29 日和 2009 年 10 月 25 日。这些日期中的哪一个更近?十月。十月与“关闭”相关联,因此我们目前必须没有 DST。
无论目标日期是在这些日期之前还是之后,您都可以计算当前(即目标)年份的 DST 开/关日期;如果开/关日期在您的目标日期的未来,那么只需对上一年再次进行规则计算。请注意,规则可能在间隔期间发生了变化,因此请务必为您正在查看的年份应用正确的规则。
此计算的最坏情况是,您必须重复上一年的两个规则计算。但是没有其他搜索,所以严格来说是 O(1)。
我在这里找到了一个 Local/DST/Tz 计算器:http: //home-4.tiscali.nl/~t876506/WhatDay.html,因为它是一个 JavaScript 小程序,您应该能够简单地编写代码。但是,它不能处理所有规则,因此您需要为其余规则添加一些代码。
更新:我刚刚注意到你的时间也有一小时和一分钟。这使事情稍微复杂了一点。如果您的日期不在“切换”日期,那么我上面给出的说明会很好。否则,您需要考虑时间。我想最干净的做法是将时间包括在您确定“最近”的时间中。即如果您的目标时间是 00:30 UTC 并且给定区域的切换时间是 01:00,那么目标年份的切换时间仍然是将来的,您必须使用上一年的切换时间。出于实际目的,这将意味着“其他”切换时间是最近的,并且它的开/关状态适用。