Une branche dérivée de How do I elegantly print the date in RFC822 format in Perl?, mais spécifique à Windows.Comment est-ce que j'imprime élégamment le format de% z (timezone) dans Perl sur Windows?
Sur les fenêtres:
C:\> perl -MPOSIX print strftime('%z', localtime()),"\n";
Rendement:
Central Daylight Time
j'attendais:
-0500
Comme tout le monde serait sur un système Linux. Comment puis-je obtenir le "-0500" sur Windows?
MISE À JOUR:
Est-ce vraiment terrible à faire à sa place? (En supposant que je ne suis pas autorisé à installer ou à emballer DateTime en aucune façon)
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";
Le problème que je l'ai remarqué est que ce retour -0600
vs -0500
(qui je pense), mais je pense que est dû aux calculs DST ou quelque chose? Je cherche principalement une approximation décente, mais je ne peux pas comprendre pourquoi mktime()
joue avec DST?
MISE À JOUR:
découvert que tzoffset()
peut être beaucoup plus « stable » en termes de DST si vous venez de forcer manuellement l'heure d'été éteint.
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 cette façon, peu importe si vous êtes DST ou non, ça va toujours revenir -0500
qui est ce que vous voulez de %z
.
Je pense que vous avez raison, mais j'espérais juste obtenir quelque chose de décent ...Et j'ai remarqué la chose% Z vs% z que je pensais être un peu ironique car Windows est sensible à la casse partout, pourquoi pas strftime() chaînes de format – dlamotte