Windows 7夏令时错误?

时间:2016-04-14 18:02:41

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

我正在尝试使用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中的一个错误。

1 个答案:

答案 0 :(得分:3)

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

  

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

     
      
  1. FileTimeToSystemTime
  2.   
  3. SystemTimeToTzSpecificLocalTime
  4.   
  5. SystemTimeToFileTime
  6.   

对于反函数,应该使用TzSpecificLocalTimeToSystemTime作为中间步骤。

您正在运行的Perl版本可能会将这些函数作为localtimetimelocal函数的Win32实现的一部分进行调用。根据问题中的评论,有些人无法重现您的结果,我猜测Perl的新版本可能已按上述方式修补。如果没有,他们应该是。 (我确信更熟悉Perl内部人员的人可以指出具体的代码和错误报告。)