2013-04-15 2 views
2

Я пытаюсь добавить часы, минуты и секунды в форматеКак добавить часы, минуты, секунды в Perl

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

Это, как правило, лучше использовать модули, такие как DateTime или Date :: Manip, чтобы сделать этот тип арифметики, но я предполагаю, что вы хотите узнать, как сделайте это (EDIT: на самом зачаточном уровне).

Убедитесь, что вы суммируете сумму до 0 до вашей петли. Вы должны сначала сделать по модулю на минут до деления:

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

EDIT: После того, как вы получите в такие вещи, как часовые пояса и летнее время, все становится очень сложным. Смотрите этот пост в качестве примера: Why is subtracting these two times (in 1927) giving a strange result?

+2

Причина использования DateTime заключается в том, что вам известно, что не все минуты имеют 60 секунд. Поэтому, если он «хочет учиться», вы должны были упомянуть об этом. – ikegami

+0

@ikegami добавил оговорку. – imran

+0

Спасибо @imran. К сожалению, я не могу использовать эти модули Date, которые, я думаю, полезны. – TheBlackCorsair

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

Протокол вычисляется как сумма, деленной на 60. 13 часов плюс 10 минут равняется 790 минут. Почему бы не сделать что-то подобное с $ mins, как вы делаете с $ sec? (Возьмите модуль)

0

Просто используйте gmtime() и конвертировать ввод в считанные секунды в то, что когда-либо читаемый формат, который вы заинтересованы в.

gmtime() ==> Возвращаемые значения локализованы для стандартного часового пояса Гринвич.

Пример код

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($sum); 

print "$hour:$min:$sec\n";; 

Если в вашем случае, если $ часов> 23, то пожалуйста, используйте $ yday переменные. $ yday это день года, в диапазоне 0..364 (или 0..365 в високосные годы).

Для преобразования в $ час умножаем его на 24, ==>$ час = ($ yday * 24) + $ hour;

Это будет работать, если разница меньше, чем 364 дней (или 0..365 в високосные годы.), Но вы все равно можете заставить его работать, добавив переменную ($ год-70) в уравнение, но он делает уравнение более сложным из-за високосных лет, надеюсь, теперь ясно, как его использовать ...

+0

Не работает для '$ hours> 23'. – PerlDuck

+0

Его работа за то, что просто используйте $ yday, переменную, ее счет в течение дня ... до 365 дней он будет работать ...Если вам требуется больше, чем это, то используйте ($ year-70) * 365, основанный в високосный год, может изменить количество дней ... См. Ответ https://stackoverflow.com/a/46848883/1760065 – Jerry

Смежные вопросы