【问题标题】:Windows 7 daylight savings bug?Windows 7 夏令时错误?
【发布时间】:2016-08-06 10:53:30
【问题描述】:

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

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

根据 Google 的说法,夏令时从 2000 年的 4 月 2 日开始:

...但由于某种原因,下面的 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 日开始,而这显然是不正确的?


编辑:

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

【问题讨论】:

  • 你运行的是什么版本的 Perl?
  • 我正在运行 Perl v5.20.1
  • 我的机器上没有得到相同的结果;我得到01:59:59 - EST02:00:00 - EST。此外,perl 使用系统 (libc) 函数来确定时区以及 DST 的开始和结束时间。所以我怀疑问题出在您的系统时区数据库中,而不是 perl。
  • 2007 年,美国从 3 月的第二个星期日开始观察夏令时(之前是 4 月的第一个星期日)。您的系统似乎错误地将新规则应用到新规则生效前的几年。
  • 使用 DateTime 库可以在任何系统上工作。它有自己的时区数据库和转换功能。

标签: perl time windows-7 windows-7-x64 dst


【解决方案1】:

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

要在将文件时间转换为本地时间时考虑夏令时,请使用以下函数序列代替 FileTimeToLocalFileTime

  1. 文件时间到系统时间
  2. SystemTimeToTzSpecificLocalTime
  3. SystemTimeToFileTime

应该对反函数执行类似的序列,将TzSpecificLocalTimeToSystemTime 用于中间步骤。

您正在运行的 Perl 版本很可能正在调用这些函数,作为 localtimetimelocal 函数的 Win32 实现的一部分。基于一些无法重现您的结果的问题中的 cmets,我猜想 Perl 的较新版本可能已按照上述方法进行了修补。如果不是,他们应该是。 (我相信更熟悉 Perl 内部的人会指出具体的代码和错误报告。)

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2012-11-25
    • 2014-04-26
    • 2017-08-28
    • 2020-03-21
    • 2021-10-18
    • 2014-11-03
    • 2017-08-16
    相关资源
    最近更新 更多