Я должен получить смещение 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
или подобный, но я действительно хотел бы не иметь любые зависимости, что я не могу гарантировать, что пользователь будет иметь из-за нашей широкой базы установки.
Я пропускаю что-то очевидное здесь? Заранее спасибо.
Время::Местное
должно сделать трюк
use Time::Local;
@t = localtime(time);
$gmt_offset_in_seconds = timegm(@t) - timelocal(@t);
"Я бы очень хотел, чтобы у меня не было никаких зависимостей, которые я не могу гарантировать пользователю из-за нашей широкой базы установки"
Как насчет того, чтобы включить пользовательскую копию Date::Time (мы назовем ее My::Date::Time) в вашу установку? Например,
use lib 'my-module/dependencies/';
use My::Date::Time;
Портативный способ состоит в том, чтобы сравнить выходную мощность 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, ...