我正在尝试将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
答案 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