Perl: миллисекунды до даты + время - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь преобразовать переменную в 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 ]

4 голосов
/ 19 июня 2019

Поскольку вы использовали DateTime,

my $dt = DateTime->new( year => 1900, time_zone => "UTC" );
$dt->add( seconds => 3747753982164.99 / 1000 );
say $dt->strftime("%Y-%m-%dT%H:%M:%S.%06N%z");  # 2018-10-05T18:45:55.000000+0000
4 голосов
/ 19 июня 2019

Вам нужно получить значение времени для 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
2 голосов
/ 23 июня 2019

Преобразования, переведенные с другого языка, намного сложнее, чем нужно. Основываясь на ответе икегами и ссылке, приведенной в комментарии, эта работа сквозная:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...