加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – Windows 7夏令时错误?

发布时间:2020-12-15 21:50:24 所属栏目:大数据 来源:网络整理
导读:我正在尝试确定何时使用Perl的本地时间函数在Perl脚本中发生夏令时转换并使用strftime打印时区. 奇怪的是,这似乎适用于今年和其他近年来,但如果我尝试回到2000年,例如,Perl似乎认为过渡发生在错误的一天! 根据谷歌的说法,夏令时于2000年4月2日开始: …但由
我正在尝试确定何时使用Perl的本地时间函数在Perl脚本中发生夏令时转换并使用strftime打印时区.

奇怪的是,这似乎适用于今年和其他近年来,但如果我尝试回到2000年,例如,Perl似乎认为过渡发生在错误的一天!

根据谷歌的说法,夏令时于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,$month - 1,$year);

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

# 03/12/2000 02:00:00
($year,2,0);
$epoch = timelocal($second,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内部的具体细节(我也不喜欢浏览源代码),但是当使用 FileTimeToLocalFileTimeLocalFileTimeToFileTime Win32函数时,这种错误通常发生在Windows上.这些功能不考虑时区的历史记录,只考虑当前规则.该文档解释了该做什么:

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和timelocal函数的Win32实现的一部分进行调用.根据问题中的评论,有些人无法重现您的结果,我猜想Perl的新版本可能已经如上所述进行了修补.如果没有,他们应该是. (我确信更熟悉Perl内部的人可以指出具体的代码和错误报告.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读