Perl конвертирует микросекунды с эпохи в местное время - PullRequest
0 голосов
/ 30 мая 2019

В perl, с учетом микросекунд, начиная с эпохи, как мне преобразовать в местное время в формате, подобном

my $time = sprintf "%02ld,%02ld,%02ld.%06ld", $hour, $min, $sec, $usec;

Например: "Вход = 1555329743301750 (микросекунды с начала эпохи) Выход = 070223.301750"

1 Ответ

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

Ядро Время :: Кусок может выполнить преобразование, но оно не обрабатывает подсекунды, поэтому вам придется обрабатывать их самостоятельно.

use strict;
use warnings;
use Time::Piece;
my $input = '1555329743301750';
my ($sec, $usec) = $input =~ m/^([0-9]*)([0-9]{6})$/;
my $time = localtime($sec);
print $time->strftime('%H%M%S') . ".$usec\n";

Время:: Moment предоставляет более приятную опцию для работы с субсекундами, но нуждается в некоторой помощи, чтобы найти смещение UTC для произвольного времени по системному местному времени, мы можем использовать Time :: Moment :: Role :: TimeZone .

use strict;
use warnings;
use Time::Moment;
use Role::Tiny ();
my $input = '1555329743301750';
my $sec = $input / 1000000;
my $class = Role::Tiny->create_class_with_roles('Time::Moment', 'Time::Moment::Role::TimeZone');
my $time = $class->from_epoch($sec, precision => 6)->with_system_offset_same_instant;
print $time->strftime('%H%M%S%6f'), "\n";

Наконец, DateTime немного тяжелее, но может обрабатывать все естественно, по крайней мере, с точностью до микросекунды.

use strict;
use warnings;
use DateTime;
my $input = '1555329743301750';
my $sec = $input / 1000000;
my $time = DateTime->from_epoch(epoch => $sec, time_zone => 'local');
print $time->strftime('%H%M%S.%6N'), "\n";

(Во избежание возможногоПроблемы с плавающей запятой, вы можете заменить my $sec = $input / 1000000 на substr(my $sec = $input, -6, 0, '.'), так что это чисто строковая операция, пока она не перейдет к модулю, если вы уверены, что она будет в этой строковой форме - но вряд ли это будет проблемой в таком масштабе.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...