【发布时间】: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 - EST和02:00:00 - EST。此外,perl 使用系统 (libc) 函数来确定时区以及 DST 的开始和结束时间。所以我怀疑问题出在您的系统时区数据库中,而不是 perl。 -
2007 年,美国从 3 月的第二个星期日开始观察夏令时(之前是 4 月的第一个星期日)。您的系统似乎错误地将新规则应用到新规则生效前的几年。
-
使用 DateTime 库可以在任何系统上工作。它有自己的时区数据库和转换功能。
标签: perl time windows-7 windows-7-x64 dst