1

我一定做错了什么,但我无法弄清楚。当我将秒作为 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 ) );

...总是打印:

diffTime = 4
hour = 16
min= 0
sec = 4
Elapsed time : 16:00:04

好的。想出了如何添加评论 - NoScript 设置太紧了。

谢谢...

我似乎无法在此线程中添加评论,所以我将在这里感谢大家。

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

4

4 回答 4

5

您正在混合持续时间和时间戳,这是在自找麻烦......您可能会像 Mansoor 建议的那样使用gmtime,但仍然使用苹果作为橙子。

以下工作,并使用核心Time::PieceTime::Seconds模块。对于$diffTime->pretty,您需要更新版本的 Time::Piece (1.20),而不是与当前版本的 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;

这可能会打印出如下内容:

150
0.0416666666666667
2.5
150
2 minutes, 30 seconds
于 2011-01-20T17:36:55.860 回答
5

$difftime是两个“纪元时间”之间的差异(自 1970 年 1 月 1 日格林威治标准时间午夜以来的秒数),但这并不能使其成为纪元时间。所以这不是一个真正合适的论据localtime()。你最好自己计算 h/m/s 细分:

($sec,$min,$hour) = ($difftime % 60, int($difftime/60) % 60, int($difftime/3600));
于 2011-01-20T17:40:57.717 回答
4

您想使用gmtime函数而不是localtime函数。

由于纪元日期是 1970 年 1 月 1 日 00:00:00 GMT/UTC,调用将为您提供您所在时区localtime(0)的纪元日期。

编辑:感谢您的跟进。如前所述,这仅在您测量的间隔小于 24 小时时才有效。localtime和函数实际上都gmtime返回日期的值:秒、分钟、小时、月中的某天、月、年、年中的某天,以及时间是否属于夏令时。当然,除了日期的上下文之外,秒、分钟和小时之外的所有内容都没有意义。

于 2011-01-20T17:12:12.913 回答
3

这与说由于 ℉ → ℃ 需要转换C = (F - 32) * 5/9,如果它变暖 5 ℉ 那必须与变暖 -15 ℃ 相同,因为这是你在插入 5 时得到的数字℉ 进入明显但错误的公式。

明白为什么这没有意义吗?升温 5 ℉ 与降温 15 ℃ 完全不同!

你的时代也犯了同样的错误。当您减去每个测量自纪元以来经过的秒数的量时,您不会得到同样测量自纪元以来经过的秒数的结果!

您只能在纪元秒上调用localtimegmtime,这意味着自纪元以来经过的秒数,而不是一般的秒数。否则,您必须自己进行除法,或者使用模块来找出减法的结果中有多少更大的单位。

于 2011-01-20T17:32:04.270 回答