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