Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 确定日期是否在DST中的有效算法_Algorithm_Datetime_Timezone_Dst - Fatal编程技术网

Algorithm 确定日期是否在DST中的有效算法

Algorithm 确定日期是否在DST中的有效算法,algorithm,datetime,timezone,dst,Algorithm,Datetime,Timezone,Dst,我正在寻找一种比O(n)算法更好的算法来确定未来的某个日期是否会应用夏令时(以及多少)。给定年、月、日、小时、分钟和时区(以及奥尔森时区数据库的副本),如何有效地确定该日期是否在DST中?我在寻找算法,而不是要调用的库函数 多谢各位 进一步说明:当您创建一个具有未来日期和时区的对象时,我使用的日期库非常慢。事实证明,它是通过线性计算来计算日期是否在夏令时。不仅如此,它还在对象创建时这样做。显然,它可以等到被问到,但它也应该更有效 当然,DST规则会发生变化,日期库无法预测未来,但另一种方法是对本

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

多谢各位

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


当然,DST规则会发生变化,日期库无法预测未来,但另一种方法是对本地化日期设置任意上限。

您的首要问题是由地方当局设置的夏令时规则。后者几乎可以在任何时候通过任何法律,因此以一种你无法预测的方式改变规则。

据我所知,DST的变化每年都在固定的一天开始和结束(4月的第一个周末,10月的最后一个周末,诸如此类)。因此,您可以使用ese查找给定年份的一周天数,并根据这些天数计算转换日期。然后,您可以确定DST是否在源和/或目标区域设置中有效。converion本身就是一个简单的加上和/或减去一个小时以补偿DST的问题,然后将时区差考虑在内

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

要获得您的DST信息,首先要做的是计算您未来日期的年/月/日(如果尚未采用该格式)。然后查找时区,并根据UTC、DST开/关规则和偏移量提取变化。根据年份的不同,可能会有几种不同的规则,您需要确保为您的“目标”年份选择正确的规则。出于下面解释的原因,了解上一年的规则可能也很方便

开/关规则将有一个有趣的规范,如“Oct lastSun”:这意味着开关发生在10月份最后一个周日的晚上

您需要做的是收集所有这些格式简洁的“规则”,并为每个规则开发一些代码,以确定该规则指示的最后日期。现在是12月,所以考虑到我所在时区的一些规则,比如“三月最后一天”和“十月最后一天”,这些日期将是2009年3月29日和2009年10月25日。这些日期中哪一个是最近的?十月。10月与“关闭”相关,因此我们目前必须没有DST

您可以计算当前(即目标)年份的DST开/关日期,无论目标日期是在这些日期之前还是之后;如果开/关日期在目标日期的未来,则只需对上一年再次进行规则计算。请注意,这些规则可能在间隔期间发生了更改,因此请确保为您所查看的年份应用正确的规则

此计算的最坏情况是,您必须重复上一年的两个规则计算。但在其他情况下不会进行搜索,所以严格来说是O(1)

我在这里找到了一个Local/DST/Tz计算器:由于它是一个JavaScript小程序,您应该能够简单地复制代码。但它不能处理所有规则,因此需要为其余规则添加一些代码



更新:我刚刚注意到你还有一小时一分钟的时间。这只会让事情变得复杂一点。如果你的约会日期不是“转换”日期,那么我上面给出的说明会对你很好。否则,你需要考虑时间。我想最干净的办法就是把时间包括在“最近”的决定中。即,如果您的目标时间为UTC 00:30,且给定区域的切换时间为01:00,则目标年的切换时间仍在未来,您必须使用上一年的切换时间。出于实际目的,这将意味着“其他”切换时间是最近的,其开/关状态适用。

Hmm,正如我所看到的,问题在于确定给定日期的工作日,在遥远的将来

为此,我建议如下:

  • 每400年一次,整个系统就会运转起来,所以首先用400年来划分年份,作为整体的一部分。在400年中,有99个闰年和301个简单的闰年。如果任意一天是星期一,那么400年后的同一天将是301+2x99=499(mod 7)-->星期一+2--->星期三。所以你必须这样说:
wday=(基准日+2*(整数)((目标年-基准年)/400))mod 7

  • 然后你可以做进一步的优化,但我想你可以一年一年地做,这样就可以了。如果(闰年)那么++else+=2,mod 7,最多可以进行399个简单操作

当你有了那一年1月1日的工作日后,你可以计算DST转换日期,正如卡尔·斯莫特里茨所写。

在10万年内,将有相当多的闰秒,其数量可能无法预测。另外,我想知道到时候时区是否还会继续使用。更不用说夏令时规则了。你不能相信他们超过2年,更不用说1000年了。你现在所处的时间是由你的政府决定的。确定当前时间的规则一直在变化,有时变化非常剧烈。对于这个问题,你是否认为确定时间的规则永远不会改变?是的,国会对Y2K反应过度,然后轻率地改变DST规则,这总是让我发笑