The was nothing requiring date math in the OP, but DateTime also does time math. Since the OP is dealing with durations, she'd need DateTime::Duration.
Unfortunately, it doesn't produce the result one would expect because DateTime(::Duration) realises that not every minute has 60 seconds. Some are longer due to leap seconds.
use strict;
use warnings;
use DateTime::Duration qw( );
my @times = qw( 5:21 8:01 5:37 7:19 5:46 7:44 6:43 7:17 8:02 6:50 7:54
+ 8:44 );
my $dur = DateTime::Duration->new();
for my $time (@times) {
my ($mins, $secs) = split(/:/, $time);
$dur += DateTime::Duration->new(
minutes => $mins,
seconds => $secs,
);
}
printf("%s hours, %s minutes, %s seconds\n",
$dur->in_units(qw( hours minutes seconds ))
);
1 hours, 19 minutes, 378 seconds
From the docs, the only conversions possible are:
- years ⇔ months
- weeks ⇔ days
- hours ⇔ minutes
- seconds ⇔ nanoseconds
Now, you can use a reference datetime to determine minute length.
...
my $dur2 = do {
my $ref = DateTime->new(
year => 2006, month => 1, day => 1,
hour => 0, minute => 0, second => 0,
time_zone => 'UTC',
);
$ref + $dur - $ref
};
printf("%s hours, %s minutes, %s seconds\n",
$dur2->in_units(qw( hours minutes seconds ))
);
my $dur3 = do {
my $ref = DateTime->new(
year => 2005, month => 12, day => 31,
hour => 23, minute => 59, second => 59,
time_zone => 'UTC',
);
$ref + $dur - $ref
};
printf("%s hours, %s minutes, %s seconds\n",
$dur3->in_units(qw( hours minutes seconds ))
);
1 hours, 19 minutes, 378 seconds
1 hours, 25 minutes, 18 seconds # All of the minutes had 60 seconds.
1 hours, 25 minutes, 19 seconds # One of the minutes had 61 seconds.
Update: Added example where leap seconds affect the result. |