Ответвление того, Как я изящно печатаю дату в формате RFC822 в Perl?, но конкретный Windows.
На окнах:
C:\> perl -MPOSIX print strftime('%z', localtime()),"\n";
Урожаи:
Central Daylight Time
Я ожидал:
-0500
Поскольку любой был бы в системе Linux. Как я могу добраться "-0500" в Windows?
ОБНОВЛЕНИЕ:
Это действительно ужасно, чтобы сделать в его месте? (Принятие мне не разрешают установить DateTime или упаковать его всегда),
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";
Проблема, которую я заметил, состоит в том, что это возвращается -0600
по сравнению с -0500
(который я ожидал бы), но мое предположение, это происходит из-за вычислений DST или чего-то? Я главным образом ищу достойное приближение, но я не могу выяснить почему mktime()
играет с DST?
ОБНОВЛЕНИЕ:
Узнанный это tzoffset()
может быть намного более "стабильным" с точки зрения DST, если Вы просто вручную вызываете DST прочь.
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);
}
Таким образом, неважно, если Вы - DST или нет, он будет всегда возвращаться -0500
который является тем, от чего Вы хотите %z
.
Я думаю, первое вы получаете потому, что
% z
специфичен для Linux Из справочной страницы:
% Z Название часового пояса или аббревиатура, или нет байтов, если информация о часовом поясе не существует.
Кроме того, "% z", похоже, относится к Linux в частности - не работает и в Solaris:
$ perl -MPOSIX -e 'print strftime("%z", localtime()),"\n"'
%z
$ perl -MPOSIX -e 'print strftime("%Z", localtime()),"\n"'
EDT
, тогда как в Linux я получаю:
$ perl -MPOSIX -e 'print strftime("%z", localtime()),"\n"'
-0400
Если у вас установлен DateTime :: Format , я думаю, он может поддерживать % z
на основе на POD. Я не установил его, поэтому пока не могу протестировать
Также DateTime может поддерживать его без DateTime :: Format.