如何在 Perl 中以 RFC822 格式优雅地打印日期?,但特定于 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?
更新:
发现tzoffset()
如果您只是手动强制 DST 关闭,就 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);
}
这样,无论您是否是 DST,它总是会返回-0500
您想要的%z
.