2010-04-13 16 views
6

How do I elegantly print the date in RFC822 format in Perl?'un bir uzantısı, ancak Windows'a özgü.Windows'ta Perl'de% z (saat dilimi) biçimini zarif bir şekilde nasıl yazdırabilirim?

Açık pencereler:

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

Verim:

 Central Daylight Time

bekliyordum:

 -0500

kimse Linux sisteminde olur gibi. Windows'da "-0500" nasıl alabilirim?

GÜNCELLEME:

bu onun yerine yapmak gerçekten kötü bir şey mi?

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

(DateTime yüklemek veya herhangi bir şekilde paketlemek için izin yok varsayarak) Fark ettim sorun bu benim tahminim olduğunu -0600 (ı beklediğiniz olan) -0500 vs ama döndürür olmasıdır DST hesaplamalarından mı kaynaklanıyor? Esasen iyi bir yaklaşım arıyorsanız, ama neden mktime() DST ile oynuyor anlayamıyorum?

GÜNCELLEME:

sadece manuel DST devre zorlarsanız tzoffset() DST açısından çok daha "kararlı" olabileceğini öğrendim.

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); 
} 

Bu şekilde, DST ya da değilseniz olursa olsun, her zaman %z istediğini olan -0500 dönersiniz.

cevap

5

Ben

  1. %z Windows'ta
  2. spesifik Linux bir şekilde gidiyor, çünkü eski alıyoruz sebebi olduğunu düşünüyorum tüm küçük harf duyarsız size ve bunun yerine büyük harf Z toplayıp. manpage itibaren

:

Ayrıca
%Z Time zone name or abbreviation, or no bytes if no time 
     zone information exists. 

, "% z" Linux'a özel olarak görünüyor - Solaris çalışmıyor ya:

$ perl -MPOSIX -e 'print strftime("%z", localtime()),"\n"' 
%z 
$ perl -MPOSIX -e 'print strftime("%Z", localtime()),"\n"' 
EDT 

Linux I oysa olsun:

DateTime::Format yüklüyse, POD tabanlı %z desteğini alabilir. Yüklü olmamasına rağmen test edemiyorum

Ayrıca DateTime, DateTime :: Format olmadan da destekleyebilir.

+0

Bence haklısın, ama sadece iyi bir şey elde etmeyi umuyordum ...Ve ben her yerde büyük-duyarlı olduğunu düşündüğüm% Z vs% z şey fark ettim, her yerde neden duyarlıdır strftime() biçimi dizeleri – dlamotte