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
.
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