How do I elegantly print the date in RFC822 format in Perl?'un bir uzantısı, ancak Windows'a özgü.Windows'ta Perl'de% z (saat dilimi) biçimini zarif bir şekilde nasıl yazdırabilirim?
Açık pencereler:
C:\> perl -MPOSIX print strftime('%z', localtime()),"\n";
Verim:
Central Daylight Time
bekliyordum:
-0500
kimse Linux sisteminde olur gibi. Windows'da "-0500" nasıl alabilirim?
GÜNCELLEME:
bu onun yerine yapmak gerçekten kötü bir şey mi?
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";
(DateTime yüklemek veya herhangi bir şekilde paketlemek için izin yok varsayarak) Fark ettim sorun bu benim tahminim olduğunu -0600
(ı beklediğiniz olan) -0500
vs ama döndürür olmasıdır DST hesaplamalarından mı kaynaklanıyor? Esasen iyi bir yaklaşım arıyorsanız, ama neden mktime()
DST ile oynuyor anlayamıyorum?
GÜNCELLEME:
sadece manuel DST devre zorlarsanız tzoffset()
DST açısından çok daha "kararlı" olabileceğini öğrendim.
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);
}
Bu şekilde, DST ya da değilseniz olursa olsun, her zaman %z
istediğini olan -0500
dönersiniz.
Bence haklısın, ama sadece iyi bir şey elde etmeyi umuyordum ...Ve ben her yerde büyük-duyarlı olduğunu düşündüğüm% Z vs% z şey fark ettim, her yerde neden duyarlıdır strftime() biçimi dizeleri – dlamotte