Perl: Получить смещение между gmtime и localtime, когда время ввода в секундах с начала эпохи, которое учитывает переход на летнее время - PullRequest
0 голосов
/ 31 мая 2019

Я хочу получить смещение в часах между местным и gmtime заданным микросекундами с начала эпохи.Пока у меня есть что-то вроде этого

# Microseconds since Epoch 
my $msec = 555329743301750;

# Convert to seconds 
my $sec = $msec/1000000;

my $val = (POSIX::mktime(localtime $sec) - POSIX::mktime(gmtime $sec)) / 60 / 60;

print "$val\n";

1) Я получаю вывод -6. (По местному времени CST) Однако я ожидаю -5.Я ожидаю, что поведение будет похоже на результат выполнения команды bash

`date -d 20190514 "+%z"`; 

2) Короче говоря, как мне вычислить смещение, подобное date -d 20190514 "+%z" в perl?

1 Ответ

0 голосов
/ 31 мая 2019

Использование ядра Время :: Кусок :

use strict;
use warnings;
use Time::Piece;

# Microseconds since Epoch 
my $usec = 555329743301750;

# Convert to seconds 
my $sec = $usec/1000000;

my $offset = localtime($sec)->tzoffset / 3600;

Time :: Moment и DateTime также могут возвращать это значение, если вы построите их так, как я показал на ваш другой вопрос .

my $offset = $time_moment->offset / 60;

my $offset = $datetime->offset / 3600;

Вы также можете создавать эти объекты из дат, но это, конечно, даст вам смещение в полночь (местное время) в этот день.

use Time::Piece;
my $time = localtime->strptime('20190514', '%Y%m%d');

use Time::Moment;
use Role::Tiny ();
my $class = Role::Tiny->create_class_with_roles('Time::Moment', 'Time::Moment::Role::TimeZone');
my $time = $class->new(year => 2019, month => 5, day => 14)->with_system_offset_same_local;

use DateTime;
my $time = DateTime->new(year => 2019, month => 5, day => 14, time_zone => 'local');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...