当输入仅为秒时,Perl Localtime返回16小时

mmr*_*tnt 1 perl time elapsed localtime

我一定做错了,但我无法弄明白.当我将秒作为localtime()的参数时,我得到秒和16小时.

my $startTime = time;

(process)

my $endTime = time;

my $diffTime = ( $endTime - $startTime );

($sec,$min,$hour) = localtime( $diffTime );

print STDERR "diffTime = $diffTime\n";
print STDERR "hour = $hour\n";
print STDERR "min= $min\n";
print STDERR "sec = $sec\n";

print( sprintf( "Elapsed time : %02d:%02d:%02d\n", $hour, $min, $sec ) );
Run Code Online (Sandbox Code Playgroud)

...始终打印:

diffTime = 4
hour = 16
min= 0
sec = 4
Elapsed time : 16:00:04
Run Code Online (Sandbox Code Playgroud)

好的.弄清楚如何添加评论 - NoScript设置太紧.

谢谢...

我似乎无法在这个帖子中添加评论,所以我要感谢大家.

不使用gmtime是问题所在.它可能不是最有效的解决方案,但它适用于我需要的东西,这只是一个简单的信息,用户可以评估他/她可能等待例程完成的时间并决定输入的大小他/她很熟悉的数据集.

msc*_*cha 5

你正在混合持续时间和时间戳,这就是在寻找麻烦...你可能gmtime像Mansoor建议的那样逃避使用,但是,你仍然使用苹果作为橙色.

以下工作,并使用核心Time :: PieceTime :: Seconds模块.因为$diffTime->pretty,你需要一个更新版本(1.20)的Time :: Piece,而不是与当前版本的Perl捆绑在一起.

use strict;
use warnings;
use 5.010;
use Time::Piece 1.20;

my $startTime = localtime();

# (process)

my $endTime = localtime();

my $diffTime = ( $endTime - $startTime );

say STDERR "diffTime = ", $diffTime;
say STDERR "hours = ", $diffTime->hours;      # not the same thing as above
say STDERR "minutes = ", $diffTime->minutes;  # not the same thing as above
say STDERR "seconds = ", $diffTime->seconds;  # not the same thing as above

say "Elapsed time: ", $diffTime->pretty;
Run Code Online (Sandbox Code Playgroud)

这可能会打印如下:

150
0.0416666666666667
2.5
150
2 minutes, 30 seconds
Run Code Online (Sandbox Code Playgroud)

  • 经过的时间不应该包括像"1970"或"2010"这样的东西,假装它不存在于`gmtime`和`localtime`中,返回值具有欺骗性和误导性.这就像说使用加法代替"2**2"的指数"可能"能够得到正确的答案. (3认同)

mob*_*mob 5

$difftime是两个"纪元时代"之间的差异(自格林威治标准时间1970年1月1日午夜起的秒数),但这并不是一个纪元时间.所以这不是一个合适的论据localtime().你最好自己计算h/m/s细分:

($sec,$min,$hour) = ($difftime % 60, int($difftime/60) % 60, int($difftime/3600));
Run Code Online (Sandbox Code Playgroud)