如何在perl中添加小时,分钟,秒

时间:2013-04-15 16:09:05

标签: perl sum

我正在尝试以格式

添加小时,分钟和秒
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

3 个答案:

答案 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)添加到其中来实现这个等式,但由于闰年,它使等式变得更加复杂,希望现在它清楚如何使用它...