Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 分时代_Perl_Perl Module_Perl Data Structures - Fatal编程技术网

Perl 分时代

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

我有一个历元值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系统调用, 换句话说,高分辨率的时间和计时器


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毫秒的值添加到这个值中。是吗