Perl将YYYYMMDD转换为16分钟的纪元时间

时间:2016-02-18 19:32:48

标签: perl

是否有perl函数将YYYYMMDD转换为16个字母的纪元时间?

我正在调用date命令:

2016-02-19 00:00:00 UTC

用于转换,但我的脚本需要很长时间才能完成数据集中的数百万个日期。

“16digit epoch time”是指一个16位十进制整数,表示自纪元以来的微秒。例如,"1455840000000000"在纪元之后是1455840000秒,因此我想要的结果是var mongoose = require('mongoose'); var codeSchema = require('./code'); var userSchema = mongoose.Schema({ google: { id: String, token: String, email: String, name: String }, codes: [codeSchema] }, {collection : 'users'});

4 个答案:

答案 0 :(得分:3)

您也可以使用Time::Moment。为了充分披露,我是Time :: Moment的作者。

use v5.10;
use Time::Moment;

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

输出:

1455840000000000

答案 1 :(得分: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";

答案 2 :(得分: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 :(得分:-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)
}