首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Perl将epoch以来的微秒数转换为localtime

Perl将epoch以来的微秒数转换为localtime
EN

Stack Overflow用户
提问于 2019-05-31 04:08:27
回答 1查看 156关注 0票数 0

在perl中,给定自纪元以来的微秒数,如何以如下格式转换为localtime

代码语言:javascript
复制
my $time = sprintf "%02ld,%02ld,%02ld.%06ld", $hour, $min, $sec, $usec;

例如:“输入= 1555329743301750 (从纪元开始的微秒)输出= 070223.301750”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 05:10:30

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

代码语言:javascript
复制
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提供了一个更好的选项来处理亚秒,但是需要一些帮助来查找系统本地时间中任意时间的协调时差,我们可以使用Time::Moment::Role::TimeZone

代码语言:javascript
复制
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稍微重一点,但可以自然地处理所有事情,至少可以达到微秒级的精度。

代码语言:javascript
复制
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";

(为了避免可能出现的浮点问题,您可以用substr(my $sec = $input, -6, 0, '.')替换my $sec = $input / 1000000,这样在它转到模块之前,它就是一个纯字符串操作,如果您确定它将是该字符串形式的话--但在这种规模下,这不太可能是一个问题。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56384965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档