Perl 分时代
我有一个历元值1372252864.901871,需要在perl中转换为localtime。我知道localtime($val),其中$val设置为1372252864.901871将值转换为本地时间。但是我还需要加上100毫秒或者说86.7毫秒的值来确定计算的本地时间。我该怎么做?函数localtime()是否处理我给出的分数历元值?您可能需要: HiRes模块实现了一个到usleep的Perl接口, nanosleep、ualarm、gettimeofday和setitimer/getitimer系统调用, 换句话说,高分辨率的时间和计时器 您可能需要: HiRes模块实现了一个到usleep的Perl接口, nanosleep、ualarm、gettimeofday和setitimer/getitimer系统调用, 换句话说,高分辨率的时间和计时器Perl 分时代,perl,perl-module,perl-data-structures,Perl,Perl Module,Perl Data Structures,我有一个历元值1372252864.901871,需要在perl中转换为localtime。我知道localtime($val),其中$val设置为1372252864.901871将值转换为本地时间。但是我还需要加上100毫秒或者说86.7毫秒的值来确定计算的本地时间。我该怎么做?函数localtime()是否处理我给出的分数历元值?您可能需要: HiRes模块实现了一个到usleep的Perl接口, nanosleep、ualarm、gettimeofday和setitimer/getiti
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;
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;
如果您只想添加一个历元时间并获得另一个历元时间,只需执行以下操作:
1372252864.901871 + .0867
如果您正在执行其他操作,则不会,localtime不会保留小数秒。您可能希望使用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;
(本例中不需要时区,但听起来像是您希望在这段时间内做的其他事情)如果您只想添加一个历元时间并获得另一个历元时间,只需执行以下操作:
1372252864.901871 + .0867
如果您正在执行其他操作,则不会,localtime不会保留小数秒。您可能希望使用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;
(本例中不需要时区,但这听起来像是您在这段时间内可能要做的其他事情)我想到的最简单的方法是使用时间处理精度为1μs的算术运算,并将结果格式化为日期/时间字符串
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
我想到的最简单的方法是使用1μs的精度处理时间运算,并将结果格式化为日期/时间字符串
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
我认为
Time::HiRes
不能满足OP的要求。他已经具有高分辨率时间值1372252864.901871
。他想把它分解成年、月、秒,秒的分辨率很高。时间:雇佣对我来说不合适。我需要将历元转换为年-月-日-秒-毫秒分辨率。然后我需要将x毫秒的值添加到这个值中。是否有任何函数负责将值添加到本地时间?我认为您可能使问题过于复杂。由于历元日期以秒为单位,而hi res值以分数秒为单位,因此将x毫秒除以我的1000,将x毫秒转换为x分数秒。将它添加到您现有的分数秒和Bob的叔叔?换句话说,保持时间为分数历元形式-在需要使用它显示之前不要转换为本地时间列表。您只需要将历元值转换为日期/时间字段,还是要更正当前时区?还有,你说你想要年-月-日-秒-毫秒。不是小时和分钟?我认为Time::HiRes
不能满足OP的要求。他已经具有高分辨率时间值1372252864.901871
。他想把它分解成年、月、秒,秒的分辨率很高。时间:雇佣对我来说不合适。我需要将历元转换为年-月-日-秒-毫秒分辨率。然后我需要将x毫秒的值添加到这个值中。是吗