2016-02-18 4 views
0

Есть ли функция perl, которая преобразует YYYYMMDD в 16-разрядную эпоху?Perl конвертировать YYYYMMDD в 16digit эпохи

Я в настоящее время вызова команды даты:

date -d 20160219 +%s%6N 

для преобразования, но мой сценарий занимает много времени, чтобы пройти через миллионы дат в моем наборе данных.

Под «16digit epoch time» я имею в виду 16-значное десятичное целое число, представляющее микросекунды с эпохи. Например, 2016-02-19 00:00:00 UTC - 1455840000 секунд после эпохи, поэтому я хочу получить "1455840000000000".

+1

Возможный дубликат (http://stackoverflow.com/questions/7726514/how-to-convert-text-date -to-timestamp) –

+0

Знаете ли вы, как я могу сделать это 16 цифр? и знаете ли вы, имеет ли он лучшую производительность, чем вызов функции даты bash? – Mozbi

+0

изучите концепции, а затем вы можете преобразовать любую строку даты/времени в метку времени, вместо того, чтобы размахивать вокруг для особо конкретного решения, а затем снова застревать, когда этот формат меняется настолько незначительно. –

ответ

0

Time::Piece может делать все, что вы хотите. После этого только правая панель 0 переместится в эпоху, так что она станет 16-значной.

#!/usr/bin/perl 
use strict; 
use warnings; 
use Time::Piece; 

my $t = Time::Piece -> strptime("20160219", 
             "%Y%m%d"); 
my $epoch = $t -> epoch; 

# make $epoch 16 digits 
$epoch .= "0" x (16 - length($epoch)); 

print "$epoch\n"; 
-3

Ничего себе, я просто на самом деле написал сценарий, чтобы взять временную метку, где он принимает метку времени, где это в секундах с начала эпохи и преобразовать его в удобочитаемом формате. Не то, что вы просили, но, возможно, вы можете отменить то, что я написал.

my $ts = $ARGV[0]; #2012-09-04-20:24:19.870 1030825460 
my $newTs = toTimeString($ts); 
print "\n".$newTs."\n"; 


## Convert from time since epoch in seconds to string YYYY-MM-DD-HH:mm:ss.sss 
sub toTimeString{ 
    my $ts=shift; 
    $ts += 432000; # Add 5 days to make computation easy. 
    my $sec = $ts-int($ts/60)*60; # Seconds 
    $ts = int($ts/60); # Convert to minutes 
    my $min = $ts%60; # minutes 
    $ts = int($ts/60); # Convert to hours. 
    my $hr = $ts%24; # hours; 
    $ts = int($ts/24); # Convert to days. 
    my $yr; 
    my $mo; 
    my $day; 
    my $days = [ [31,28,31,30,31,30,31,31,30,31,30,31], 
        [31,29,31,30,31,30,31,31,30,31,30,31] 
       ]; 
    our $cumDays = [ [0,31,59,90,120,151,181,212,243,273,304,334], 
        [0,31,60,91,121,152,182,213,244,274,305,335] 
       ]; 
    if($ts<366){$yr=1980;} 
    else{ 
     $yr = 1981 + int(($ts-366)/1461)*4; 
     $ts = $ts - 366 - int(($ts-366)/1461)*1461; 
     if($ts < 1095){$yr += int($ts/365); $ts = $ts - int($ts/365)*365;} 
     else{$yr = $yr+3; $ts=$ts-1095;} 
    } 
    my $leap=0; 
    my $i; 
    if($yr%4 == 0){$leap=1;} 
    for($i=0;$i<12;$i++){ 
     if($ts > $cumDays->[$leap]->[$i]){ 
      $mo=$i+1; 
     } 
    } 
    $day=$ts-$cumDays->[$leap]->[$mo-1]+1; 
    my $ret; 
    $ret = sprintf("%04d",$yr)."-".sprintf("%02d",$mo)."-".sprintf("%02d",$day)."-"; 
    $ret = $ret.sprintf("%02d",$hr).":".sprintf("%02d",$min).":".sprintf("%02d",int($sec)); 
    $ret = $ret."\.".sprintf("%03d",int($sec*1000)%1000); 
    return ($ret) 
} 
+1

Я думаю, что моя челюсть просто ударилась о пол. –

+0

ну, это не то, что задал ОП, но мне часто нужно конвертировать секунды с эпохи в считываемые временные метки из наших журналов, когда я печатаю их в .csv-файлы, и я написал это, чтобы помочь мне. – YouHaveaBigEgo

+1

Не только это, но есть хорошо протестированные библиотеки, которые могут делать то же самое в двух строках. –

0

Вы можете использовать Time :: Local модуль ядра:

use Time::Local 'timelocal'; 

$date = "20160218"; 
($year, $month, $day) = unpack "A4A2A2", $date; 

$time = timelocal(0, 0, 0, $day, $month-1, $year); 
$time .= '000000'; 
3

Вы также можете использовать Time::Moment. В интересах полного раскрытия я являюсь автором Time :: Moment.

use v5.10; 
use Time::Moment; 

say Time::Moment->from_string('20160219' . 'T00Z') 
       ->strftime('%s%6N'); 

Выход: [? Как преобразовать дату текста в отметку времени]

1455840000000000