我的纪元值为1372252864.901871,需要在perl中转换为localtime。我知道$ val设置为1372252864.901871的localtime($ val)将值转换为本地时间。但我还需要为此添加100毫秒或86.7毫秒的值,并确定计算的本地时间。我该怎么做呢?函数localtime()是否处理我给出的分数纪元值?
答案 0 :(得分:4)
如果您只想添加一个纪元时间并获得另一个纪元时间,请执行以下操作:
1372252864.901871 + .0867
如果您正在做其他事情,不,本地时间不会保留小数秒。您可能希望使用DateTime来处理小数秒:
use DateTime;
my $time = DateTime->from_epoch(epoch=>1372252864.901871, time_zone=>'local');
$time->add(nanoseconds=>86.7e6);
print $time->epoch + $time->nanosecond / 1e9;
(此示例不需要time_zone,但听起来就像您可能想要的其他事情,这次你可能会做的事情)
答案 1 :(得分:0)
您可能需要Time::HiRes:
Time :: HiRes模块实现了usleep的Perl接口, nanosleep,ualarm,gettimeofday和setitimer / getitimer系统调用, 换句话说,高分辨率时间和定时器
答案 2 :(得分:0)
localtime
函数将原始时间(如1372252864
)分解为年,月,日等。原始时间的任何小数部分都会被忽略。
我不知道内置或模块中的任何功能,它支持分解时间超过1秒的故障时间。
但是既然你已经小数秒,我会说你已经可以做你需要做的事了。只需使用localtime
(或gmtime
)来细分原始时间戳的整数部分,然后取小数部分:
$timestamp = 1372252864.901871;
@parts = localtime($timestamp);
$fraction = $timestamp - int($timestamp);
$milliseconds = int($fraction * 1000.0);
编写自己的localtime
高分辨率替代品应该很容易为您完成此任务。
如果您需要在时间戳上添加86.7毫秒,则无论如何都需要使用原始表单:
$timestamp = 1372252864.901871;
$timestamp += 86.7/1000.0;
答案 3 :(得分:0)
对我来说,最简单的方法是使用Time::HiRes::Value
来处理算术,精确度为1μs,Time::Piece
将结果格式化为日期/时间字符串。
Time::HiRes::Value
将时间保存为双元素数组;第一个字段具有整秒,而第二个字段具有微秒数。这与Time::HiRes
函数使用的格式相同,但我知道的任何内容都不会原生地转换为日期/时间字符串,所以我使用Time::Piece
来转换整个秒并只是附加了小秒数。
看起来像这样
use strict;
use warnings;
use Time::HiRes::Value;
use Time::Piece;
my $dt = Time::HiRes::Value->new(1372252864.901871);
my $delta = Time::HiRes::Value->new(86.7E-3); # 86.7ms
$dt += $delta;
print dt_to_string($dt), "\n";
sub dt_to_string {
my ($dt) = @_;
Time::Piece->new($dt->[0])->datetime =~ s{(\d+)\z}{$1 + $dt->[1] / 1E6}er;
}
<强>输出强>
2013-06-26T14:21:4.98857