如何在Perl中计算并将localtime转换为unix时间戳

时间:2015-11-19 16:30:30

标签: perl

我的脚本是:

   use warnings;
   use strict;

my $start_time = localtime();
     $sql = "INSERT into Table1, Select (VAr1, Var2, Var3 ...........)";
my $end_time = localtime();
my $run_time = ($end_time - $start_time);

my @months = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
my ($sec, $min, $hour, $day,$month,$year) = (localtime($run_time))[0,1,2,3,4,5]; 
print "Unix time ".$run_time." converts to ".$months[$month]." ".$day.", ".($year +=1900);
print " ".$hour.":".$min.":".$sec."\n";

当我运行它时,我没有获得所需的输出。

Unix时间648转换为Jan,1900 ::

我需要得到小时:分:秒 脚本计算插入表中的时间。

谢谢

2 个答案:

答案 0 :(得分:2)

$run_time不是时间戳(自纪元以来代表日期时间的秒数),因此将其传递给localtime是没有意义的。

my $s = $run_time % 60;  $run_time = ($run_time - $s) / 60;
my $m = $run_time % 60;  $run_time = ($run_time - $m) / 60;
my $h = $run_time;

my $formatted_run_time = sprintf "%d:%02d:%02d", $h, $m, $s;

你也可以变得更加漂亮:

my $formatted_run_time =
   $h ? sprintf "%d:%02d:%02d", $h, $m, $s
   $m ? sprintf "%d:%02d", $m, $s
   $s;

答案 1 :(得分:1)

localtime用于将unix时间戳转换为人类可读的时间(或其部分列表),但是您在几秒钟内给它一个持续时间。它会像时间戳一样对待它,并给你一个非常低的日期和时间。

print scalar localtime 648;
# gives Thu Jan  1 01:10:48 1970

您的代码提供以下输出:

  

Unix时间648转换为1970年1月1日1:10:48

问题在于你在这里混合了两个概念。

您可能希望使用Benchmark模块,这是出于此目的。

use strict;
use warning;
use Benchmark;

my $t0 = Benchmark->new;

# do your database stuff here

my $t1 = Benchmark->new;
my $td = timediff($t1, $t0);
print "the code took:",timestr($td),"\n";

如果您使用的是Linux或Unix,还可以使用the time program来确保程序的整体运行时间。

$ time perl foo.pl
real    0m2.241s
user    0m2.236s
sys 0m0.000s

$