gpt4 book ai didi

perl - Windows 7 夏令时错误?

转载 作者:行者123 更新时间:2023-12-04 08:42:06 27 4
gpt4 key购买 nike

我正在尝试使用 Perl 的 localtime 确定在 Perl 脚本中发生夏令时转换的确切时间。函数并使用 strftime 打印时区.

奇怪的是,这似乎在今年和其他最近几年工作得很好,但是如果我尝试回到 2000 年,例如,Perl 似乎认为转换发生在错误的日子!

据谷歌称,夏令时于 2000 年的 4 月 2 日开始:

enter image description here

...但出于某种原因,下面的 Perl 代码似乎不同意:

use POSIX qw(strftime);
use Time::Local;

# 03/12/2000 01:59:59
($year, $month, $day, $hour, $minute, $second) = (2000, 3, 12, 1, 59, 59);
$epoch = timelocal($second, $minute, $hour, $day, $month - 1, $year);

# Print the time
print strftime "%m/%d/%Y %H:%M:%S - %Z\n", localtime($epoch);

# 03/12/2000 02:00:00
($year, $month, $day, $hour, $minute, $second) = (2000, 3, 12, 2, 0, 0);
$epoch = timelocal($second, $minute, $hour, $day, $month - 1, $year);

# Print the time
print strftime "%m/%d/%Y %H:%M:%S - %Z\n", localtime($epoch);

输出:
03/12/2000 01:59:59 - Eastern Standard Time
03/12/2000 03:00:00 - Eastern Daylight Time

为什么 Perl 认为 2000 年的夏令时从 3 月 12 日开始,而这显然是不正确的?

编辑:

阅读下面的评论后,看起来这可能是操作系统的问题,而不是 Perl。看起来这可能是 Windows 7 中的一个错误。

最佳答案

我不知道 Perl 内部的细节(我也不想浏览源代码),但是在使用 FileTimeToLocalFileTime 时,Windows 上通常会发生这样的错误。和 LocalFileTimeToFileTime Win32 函数。这些函数不考虑时区的历史,只考虑当前的规则。文档解释了该怎么做:

To account for daylight saving time when converting a file time to a local time, use the following sequence of functions in place of using FileTimeToLocalFileTime:

  1. FileTimeToSystemTime
  2. SystemTimeToTzSpecificLocalTime
  3. SystemTimeToFileTime

应该对反函数执行类似的序列,使用 TzSpecificLocalTimeToSystemTime为中间步骤。
您运行的 Perl 版本很可能正在调用这些函数作为 localtime 的 Win32 实现的一部分。和 timelocal职能。根据问题中的评论,有些人无法重现您的结果,我猜想较新版本的 Perl 可能已按上述方式进行了修补。如果没有,他们应该是。 (我相信更熟悉 Perl 内部结构的人可以指出具体的代码和错误报告。)

关于perl - Windows 7 夏令时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36630667/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com