【问题标题】:How do calculate and convert localtime to unix time stamp in Perl如何在 Perl 中计算本地时间并将其转换为 unix 时间戳
【发布时间】:2015-11-21 00:13:10
【问题描述】:

我的脚本是:

   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 ::

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

谢谢

【问题讨论】:

  • unix 时间的纪元是 1970 年,而不是 1900 年。
  • 在 Stack Overflow 上写问题时请多加小心。如果该部分代码与问题无关,您可以只使用 cmets,而不是提供无法编译的代码来说明某些内容。如果您显示的输出实际上是您发布的程序正在产生的结果,那也很好。
  • 单次插入真的需要超过小数秒吗?
  • 是的,我们正在谈论数百万的数据

标签: perl


【解决方案1】:

$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;

【讨论】:

  • 但即使它不是时间戳,也可以将其传递给 gmtime:use Time::Piece "gmtime"; say gmtime($run_time)->strftime("%H:%M:%S")(假设不到一天)
  • @ysth,没错,虽然使用内置的 gmtime 并从 POSIX 中获取 strftime 会更简单,也不会那么神奇。
  • 我做了 gmtime($run_time)->strftime("%H:%M:%S") 但我没有得到我的脚本的运行时间。我需要 h:m:s
  • @doudy_05,如果您有问题,请作为问题。我不是在玩猜谜游戏。
  • @doudy_05,哦,我以为你想使用 ysth 的代码(因为你(错误地)声称它不起作用)。
【解决方案2】:

localtime 用于将 unix 时间戳转换为人类可读的时间(或其中一部分的列表),但您以秒为单位给它一个 duration。它会将其视为时间戳,并为您提供非常低的日期和时间。

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

$

【讨论】:

  • / 它不起作用:执行时间:0 挂钟秒(0.00 usr + 0.00 sys = 0.00 CPU)
  • @doudy_05 如果您所做的只是设置一个$sql 变量,而不是实际运行查询,那将是有意义的
  • 我的脚本是运行查询以将新值插入表中,持续时间为 1m07s
  • 这是我得到的输出:代码耗时:0 wallclock secs (0.00 usr + 0.00 sys = 0.00 CPU)
  • @doudy 你可能把第一个 Benchmark 对象放在你想要计时的代码下面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2015-12-22
  • 2017-03-30
  • 2021-05-13
  • 2013-12-14
相关资源
最近更新 更多