¿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
-
%z
es específico de Linux - 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.