PerlでRFC822形式の日付をエレガントに印刷するにはどうすればよいですか?、ただし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で遊んでいるのか理解できません。
アップデート:
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
ます。