6

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";

私が気付いた問題は、これが-0600vs -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ます。

4

1 に答える 1

5

あなたが前者を取得している理由は、

  1. %zLinux固有です
  2. Windows では、どういうわけか大文字と小文字が区別されず、代わりに大文字の Z が使用されます。

マンページから:

%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 なしでサポートする場合があります。

于 2010-04-13T18:44:21.120 に答える