2010-04-13 7 views
6

Una derivazione di How do I elegantly print the date in RFC822 format in Perl?, ma specifica per Windows.Come si stampa elegantemente il formato% z (fuso orario) in Perl su Windows?

su Windows:

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

ottiene:

 Central Daylight Time

mi aspettavo:

 -0500

come chiunque farebbe su un sistema Linux. Come posso ottenere "-0500" su Windows?

UPDATE:

questo è davvero terribile da fare al suo posto? (Supponendo che non mi è permesso di installare DateTime o il pacchetto in qualsiasi modo)

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

Il problema che ho notato è che questo restituisce -0600 vs -0500 (che mi aspetto), ma la mia ipotesi è che è dovuto a calcoli di DST o qualcosa del genere? Sto principalmente cercando un'approssimazione decente, ma non riesco a capire perché mktime() stia giocando con l'ora legale?

UPDATE:

scoperto che tzoffset() può essere molto più "stabile" in termini di DST se si forza manualmente l'ora legale off.

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

In questo modo, non importa se sei l'ora legale o no, sarà sempre tornare -0500 che è quello che si vuole da %z.

risposta

5

Penso che il motivo che stai ricevendo il primo è perché

  1. %z è Linux specifica
  2. Su Windows è in qualche modo andando tutto case-insensitive su di voi e raccogliendo maiuscola Z invece.

Da manpage:

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

Inoltre, "% z" sembra essere specifico di Linux - non funziona su Solaris sia:

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

mentre su Linux I get:

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

Se si dispone di DateTime::Format installato, penso che potrebbe essere suport %z basato su POD. Non ce l'ho installato quindi non posso ancora testare

Anche DateTime può supportarlo senza il DateTime :: Format.

+0

Penso che tu abbia ragione, ma stavo solo sperando di ottenere qualcosa di decente ...E ho notato che% Z vs% z cosa che pensavo fosse ironico dato che Windows fa distinzione tra maiuscole e minuscole ovunque, perché non stringhe di formato strftime() – dlamotte

Problemi correlati