代码之家  ›  专栏  ›  技术社区  ›  dlamotte

如何在Windows上用Perl优雅地打印%z(时区)格式?

  •  6
  • dlamotte  · 技术社区  · 15 年前

    分支 How do I elegantly print the date in RFC822 format in Perl? ,但特定于Windows。

    在Windows上:

        C:\> perl -MPOSIX
        print strftime('%z', localtime()),"\n";
    

    产量:

        Central Daylight Time

    我在期待:

        -0500

    就像Linux系统上的任何人一样。我怎样才能在窗户上找到“-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);
    }
    

    这样,不管你是不是夏令时,它总会回来的 - 0500 这就是你想要的 %z .

    1 回复  |  直到 15 年前
        1
  •  5
  •   cjm    15 年前

    我想你得到前者的原因是

    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 基于吊舱。我没有安装,所以还不能测试

    DateTime也可以不使用DateTime::格式来支持它。