2010-04-13 5 views
6

Un vástago de How do I elegantly print the date in RFC822 format in Perl?, pero específico de Windows.¿Cómo imprimo elegantemente el formato% z (zona horaria) en Perl en Windows?

en Windows:

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

se obtiene:

 Central Daylight Time

que estaba esperando:

 -0500

como cualquiera lo haría en un sistema Linux. ¿Cómo puedo obtener el "-0500" en Windows?

ACTUALIZACIÓN:

¿Es esta realmente terrible que hacer en su lugar? (Suponiendo que no se me permite instalar DateTime o paquete de ninguna manera)

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

El problema que he notado es que esto devuelve -0600 vs -0500 (que era de esperar), pero mi conjetura es que se debe a los cálculos de horario de verano o algo así? Principalmente estoy buscando una aproximación decente, pero no puedo entender por qué mktime() está jugando con DST?

ACTUALIZACIÓN:

descubrí que tzoffset() puede ser mucho más "estable" en términos de horario de verano si sólo fuera fuerza manualmente el horario de verano.

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

De esta manera, no importa si usted es el horario de verano o no, que va siempre vuelven -0500 que es lo que quieres de %z.

Respuesta

5

Creo que la razón de que está recibiendo el anterior se debe a que

  1. %z es específico de Linux
  2. En Windows es de alguna manera va todo entre mayúsculas y minúsculas en usted y recogiendo mayúscula Z en su lugar.

De página del manual:

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

Además, "% z" parece ser específico de Linux - no funciona en Solaris, ya sea:

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

mientras que en Linux I consiga:

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

Si tiene DateTime::Format instalado, creo que podría soportar %z basado en POD. No lo tengo instalado, así que aún no puedo probar

También DateTime puede admitirlo sin DateTime :: Format.

+0

Creo que tienes razón, pero solo esperaba obtener algo decente ...Y noté el% Z vs% z cosa que pensé que era algo irónico ya que Windows es sensible a mayúsculas y minúsculas en todas partes, ¿por qué no strftime() cadenas de formato – dlamotte

Cuestiones relacionadas