Perl将自纪元以来的微秒转换为本地时间

时间:2019-05-30 20:08:27

标签: perl epoch

在perl中,自历元起以毫秒为单位,我如何以

格式转换为本地时间
my $time = sprintf "%02ld,%02ld,%02ld.%06ld", $hour, $min, $sec, $usec;

例如:“输入= 1555329743301750(自历元以来的微秒数)输出= 070223.301750”

1 个答案:

答案 0 :(得分:4)

核心Time::Piece可以进行转换,但是它不能处理亚秒级的数据,因此您需要自己处理。

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";

Time::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, '.'),因此,如果您确定它将以该字符串形式出现,那么在进入模块之前,它只是一个字符串操作-但在这种规模的情况下,这不太可能成为问题。)