use DateTime::Format::Strptime qw( );
my $format = DateTime::Format::Strptime->new(
pattern => '%FT%T.%6N',
time_zone => 'UTC', # Or 'local' or 'America/Toronto' or '-0500'
on_error => 'croak',
);
my $dt = $format->parse_datetime('2019-01-24T00:00:05.011719');
$dt->set_formatter($format); # Set default stringification format.
$dt->truncate( to => 'second' )->add( seconds => 1 ) if $dt->nanosecond;
$dt->truncate( to => 'minute' )->add( minutes => 1 ) if $dt->second;
$dt->add( minutes => 5 - ( $dt->minute % 5 ) ) if $dt->minute % 5;
say $dt; # 2019-01-24T00:05:00.000000
Обратите внимание, что формат, используемый 2019-01-24T00:00:05.011719
, является неоднозначным, если соответствующий часовой пояс соблюдает DST (из-за повторяющегося часа в падении).
Кроме того, приведенный выше код корректно обрабатывает разрывы с течением времени, например, возникающие при изменениях летнего времени, если разрыв начинается и заканчивается в точке округления.