我正在尝试以格式
添加小时,分钟和秒HH:MM:SS
并且小时和秒似乎正在添加,但我正在努力格式化分钟。我所做的是将小时/分钟/秒转换为秒,将它们和重新转换相加。这是我的代码。
use strict;
use warnings;
my @total_sum = qw(10:07:03 01:01:01 02:02:02);
my ($sum, $hrs, $mins, $sec);
for my $t (@total_sum) {
my ($h, $m, $s) = split /:/, $t;
my $hm = $h*3600;
my $tm = $m*60;
$sum = $sum + $hm + $tm + $s;
}
$sec = sprintf ("%02d", $sec = $sum%60);
$mins = int($sum/60);
$hrs = int($sum/3600);
print "$hrs:$mins:$sec\n";
我得到的是:
13:790:06 instead of
13:10:06
答案 0 :(得分:4)
通常最好使用像DateTime或Date :: Manip这样的模块来做这种类型的算术,但我想你想学习如何做到这一点(编辑:在最基本的层面)。
确保在循环之前将sum初始化为0。 你需要先在分钟前的分钟上做一个模数:
$sec = sprintf ("%02d", $sum%60);
$mins = sprintf("%02d", ($sum%3600)/60);
$hrs = int($sum/3600);
编辑:一旦进入时区和夏令时等事情,事情变得非常复杂。请参阅此帖子作为示例:Why is subtracting these two times (in 1927) giving a strange result?
答案 1 :(得分:2)
$sec = sprintf ("%02d", $sec = $sum%60);
$mins = int($sum/60);
$hrs = int($sum/3600);
分钟计算为总和除以60. 13小时加10分钟等于790分钟。为什么不像$ sec一样用$ min做类似的事情呢? (取模数)
答案 2 :(得分:0)
只需使用gmtime()
并在几秒钟内将输入转换为您感兴趣的可读格式。
gmtime()
==>返回值已针对标准格林威治时区进行了本地化。
示例代码
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($sum);
print "$hour:$min:$sec\n";;
如果在您的情况下 $ hour> 23 ,请使用 $ yday 变量。 $ yday 是一年中的某一天,范围为0..364(或闰年为0..365)。
转换为$ hour乘以24,==> $ hour =($ yday * 24)+ $ hour;
如果您的差异小于364天(或闰年为0..365),它将起作用。但您仍然可以通过将变量($ year-70)添加到其中来实现这个等式,但由于闰年,它使等式变得更加复杂,希望现在它清楚如何使用它...