如何在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
。
我想你得到前者的原因是因为
%z
是Linux特定的 从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。