Что лучший способ состоял в том, чтобы сместить UTC в Perl?

Я должен получить смещение UTC зоны текущего времени в Perl в кросс-платформенном (Windows и различные разновидности Unix) путь. Это должно встретить этот формат:

zzzzzz, который представляет ±hh:mm относительно UTC

Похоже, что я должен быть в состоянии получить его через strftime(), но это, кажется, не последовательно.

Unix:

Input: perl -MPOSIX -e "print strftime(\"%z\", localtime());"
Output: -0700

Windows:

Input: perl -MPOSIX -e "print strftime(\"%z\", localtime());"
Output: Mountain Standard Time

В то время как кажется, что Unix дает мне, что я хочу (или по крайней мере что-то закрывается), Windows не. Я вполне уверен, я могу сделать это с Date::Time или подобный, но я действительно хотел бы не иметь любые зависимости, что я не могу гарантировать, что пользователь будет иметь из-за нашей широкой базы установки.

Я пропускаю что-то очевидное здесь? Заранее спасибо.

9
задан Morinar 26 January 2010 в 23:35
поделиться

3 ответа

Время::Местное должно сделать трюк

use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);
15
ответ дан 4 December 2019 в 14:28
поделиться

"Я бы очень хотел, чтобы у меня не было никаких зависимостей, которые я не могу гарантировать пользователю из-за нашей широкой базы установки"

Как насчет того, чтобы включить пользовательскую копию Date::Time (мы назовем ее My::Date::Time) в вашу установку? Например,

use lib 'my-module/dependencies/';

use My::Date::Time;
0
ответ дан 4 December 2019 в 14:28
поделиться

Портативный способ состоит в том, чтобы сравнить выходную мощность loctime с GMTime

    $t = time;
    @a = localtime($t);
    @b = gmtime($t);

    $hh = $a[2] - $b[2];
    $mm = $a[1] - $b[1];
    # in the unlikely event that localtime and gmtime are in different years
    if ($a[5]*366+$a[4]*31+$a[3] > $b[5]*366+$b[4]*31+$b[3]) {
      $hh += 24;
    } elsif ($a[5]*366+$a[4]*31+$a[3] < $b[5]*366+$b[4]*31+$b[3]) {
      $hh -= 24;
    }
    if ($hh < 0 && $mm > 0) {
      $hh++;
      $mm = 60-$mm;
    }
    printf "%+03d:%02d\n", $hh, $mm;

, кто указывает, что это уже реализовано в модуле где-то в 5, 4 , 3, ...

-1
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

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