2010-04-13 48 views
6

How do I elegantly print the date in RFC822 format in Perl?的分支,但Windows特定。如何在Windows上優雅地打印Perl中的%z(時區)格式?

在Windows上:

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

產量:

 Central Daylight Time

我期待:

 -0500

有人肯在Linux系統上。我怎樣才能在Windows上獲得「-0500」?

更新:

這樣做真的很糟糕嗎? (假設我不能安裝日期時間或以任何方式將其打包)

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?

UPDATE:

發現,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想要的東西。

回答

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,我認爲它可能支持基於POD的%z。我沒有安裝它,所以無法測試

此外DateTime可能支持它沒有DateTime :: Format。

+0

我認爲你是對的,但我只是希望得到一些體面的...而且我注意到了%Z vs%z的東西,我認爲這有點諷刺意味,因爲Windows在任何地方都區分大小寫,爲什麼不使用strftime()格式的字符串 – dlamotte 2010-04-13 18:56:58

相關問題