6

如何在 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";

我注意到的问题是这会返回-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. %z是 Linux 特定的
  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 回答