Как я изящно печатаю %z (часовой пояс) формат в Perl в Windows?

Ответвление того, Как я изящно печатаю дату в формате 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.

6
задан Community 23 May 2017 в 10:32
поделиться

1 ответ

Я думаю, первое вы получаете потому, что

  1. % z специфичен для Linux
  2. В Windows он каким-то образом не учитывает регистр и вместо этого использует букву Z в верхнем регистре.

Из справочной страницы:

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

5
ответ дан 17 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: