Perl:毫秒至日期和时间

时间:2019-06-18 21:01:20

标签: perl datetime

我正在尝试将Perl中包含毫秒的变量转换为日期/时间格式。 问题是变量来自大型机TIMESTAMP,无法由Unix / Linux转换,因为持续时间(如果我没有记错的话)始于1900-01-01 00:00:00。 预先感谢。

perl:

my $milli_secs = ((hex(unpack('H*', substr($updt_time,0,3))) * 1099511627776) +
              (hex(unpack('H*', substr($updt_time,3,3))) * 65536) +
              (hex(unpack('H*', substr($updt_time,6,2)))));
$milli_secs = $milli_secs / 16;
$milli_secs = ($milli_secs * 3.90625) / 1000000;
print "$milli_secs\n";
my $tp = DateTime->from_epoch( epoch => $milli_secs );
print "Date ==> $tp\n";

结果: 3747753982164.99 日期==> 120731-08-07T04:49:24

我的变量: EBCDIC时间戳记:D508FF8D00000000 经过一些计算,我得到: 纳秒:3.74775398216499e + 18 毫秒:3747753982164.99

我应该给谁: 2018-10-05 18:46:22.1

3 个答案:

答案 0 :(得分:4)

您需要获取1900-01-01的时间值并将其用作纪元:

use Time::Local;

my $epoch = timelocal(0,0,0,1,0,1900);

my $ms = 3747753982164.99;
my $time = $ms / 1000;

print scalar localtime $epoch + $time, "\n";

输出

Fri Oct  5 19:16:05 2018

答案 1 :(得分:4)

由于您使用的是DateTime,

setup.inc

答案 2 :(得分:2)

从另一种语言翻译而来的转换比所需的要复杂得多。建立在池上的答案和评论中提供的链接的基础上,端到端有效:

use DateTime;
my $micros = hex(substr $updt_time, 0, 13);
my $dt = DateTime->new(year => 1900, time_zone => "UTC");
$dt->add(seconds => $micros / 1e6);
say $dt->strftime("%Y-%m-%dT%H:%M:%S.%06N%z"); # 2018-10-05T18:45:55.000000+0000