如何在Windows上优雅地打印Perl中的%z(timezone)格式?

如何在Perl中优雅地打印RFC822格式的date? ,但Windows具体。

在Windows上:

     C:\> perl -MPOSIX
     print strftime('%z',localtime()),“\ n”;

产量:

 中央夏令时间 

我期待着:

  -0500 

就像任何人在Linux系统上一样。 我怎样才能在Windows上获得“-0500”?

更新:

这真的太可怕了吗? (假设我不允许安装DateTime或以任何方式打包)

C:\> perl -MPOSIX sub tzoffset { my $t = time(); my $utc = mktime(gmtime($t)); my $local = mktime(localtime($t)); return ($local - $utc); } sub zformat { my ($tzoffset) = @_; my $z = ''; if ($tzoffset < 0) { $z .= '-'; $tzoffset *= -1; } my $hours = floor($tzoffset / 60 / 60); my $minutes = $tzoffset - $hours * 60 * 60; $z .= sprintf('%02d%02d', $hours, $minutes); return $z; } print zformat(tzoffset()),"\n"; 

我注意到的问题是,这返回-0600 vs -0500 (我期望),但我的猜测是由于DST计算或什么? 我主要是寻找一个体面的近似,但我不明白为什么mktime()正在玩DST?

更新:

发现如果你只是手动强制closuresDST, tzoffset()在DST方面可以更“稳定”。

 sub tzoffset { my $t = time(); my $utc = mktime(gmtime($t)); my @tmlocal = localtime($t); $tmlocal[8] = 0; # force dst off, timezone specific my $local = mktime(@tmlocal); return ($local - $utc); } 

这样,不pipe你是不是DST,它总是会返回-0500 ,这是你想从%z

我想你得到前者的原因是因为

  1. %z是Linux特定的
  2. 在Windows上,它会以某种方式对您不区分大小写,而是采用大写字母Z代替。

从manpage:

 %Z Time zone name or abbreviation, or no bytes if no time zone information exists. 

另外,“%z”似乎是Linux特定的 – 在Solaris上也不起作用:

 $ perl -MPOSIX -e 'print strftime("%z", localtime()),"\n"' %z $ perl -MPOSIX -e 'print strftime("%Z", localtime()),"\n"' EDT 

而在Linux上我得到:

 $ perl -MPOSIX -e 'print strftime("%z", localtime()),"\n"' -0400 

如果你安装了DateTime :: Format ,我认为它可能支持%z基于POD。 我没有安装,所以不能测试呢

另外DateTime可以支持它没有DateTime :: Format。