windows perl timezone rfc822

¿Cómo imprimo elegantemente el formato% z(zona horaria) en Perl en Windows?



timezone rfc822 (1)

Una rama de ¿Cómo imprimo elegantemente la fecha en formato RFC822 en Perl? , pero específico de Windows.

En windows:

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

Rendimientos:

Central Daylight Time

Yo estaba esperando:

-0500

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

ACTUALIZAR:

¿Es realmente terrible hacer esto en su lugar? (Suponiendo que no tengo permiso para instalar DateTime o empaquetarlo 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 -0600 (lo cual era de esperar), pero creo 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?

ACTUALIZAR:

Descubrió que tzoffset() puede ser mucho más "estable" en términos de DST si solo fuerza el DST manualmente.

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 forma, no importa si eres DST o no, siempre devolverá -0500 que es lo que quieres de %z .


Creo que la razón por la que obtienes lo primero es porque

  1. %z es específico de Linux
  2. En Windows, de alguna manera no te importa mayúsculas y minúsculas en lugar de mayúsculas.

De la página de 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; tampoco funciona en Solaris:

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

mientras que en Linux obtengo:

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

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

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