2

我正在尝试以格式添加小时、分钟和秒

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
4

3 回答 3

4

通常最好使用 DateTime 或 Date::Manip 之类的模块来执行此类算术,但我想您想学习如何执行此操作(编辑:在最基本的级别上)。

确保在循环之前将 sum 初始化为 0。在除法之前,您需要先对分钟进行取模:

$sec = sprintf ("%02d", $sum%60);
$mins = sprintf("%02d", ($sum%3600)/60);
$hrs = int($sum/3600);

编辑:一旦你进入时区和夏令时,事情就会变得非常复杂。以这篇文章为例:为什么减去这两次(在 1927 年)会产生奇怪的结果?

于 2013-04-15T16:17:52.367 回答
2
     $sec = sprintf ("%02d", $sec = $sum%60);
     $mins = int($sum/60);
     $hrs = int($sum/3600);

分钟计算为总和除以 60。13 小时加上 10 分钟等于 790 分钟。为什么不像使用 $sec 那样使用 $mins 做一些类似的事情呢?(取模数)

于 2013-04-15T16:18:00.660 回答
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)使其起作用,但这会使方程更复杂,因为闰年,希望现在清楚如何使用它......

于 2017-10-20T13:50:17.280 回答