时代的分数部分

时间:2015-05-04 15:27:47

标签: perl perl-module perl-data-structures

我的纪元值为1372252864.901871,需要在perl中转换为localtime。我知道$ val设置为1372252864.901871的localtime($ val)将值转换为本地时间。但我还需要为此添加100毫秒或86.7毫秒的值,并确定计算的本地时间。我该怎么做呢?函数localtime()是否处理​​我给出的分数纪元值?

4 个答案:

答案 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