How can I round a date to nearest 15 minute interval in Perl?
I want to round current ti开发者_运维问答me to the nearest 15
minute interval.
6:07
, it would read 6:15
as the start time.
How can I do that?
You can split the time into hours and minutes and then use the ceil
function as:
use POSIX;
my ($hr,$min) = split/:/,$time;
my $rounded_min = ceil($min/15) * 15;
if($rounded_min == 60) {
$rounded_min = 0;
$hr++;
$hr = 0 if($hr == 24);
}
The nearest 15 minute interval to 6:07 is 6:00, not 6:15. Do you want the nearest 15 minute interval or the next 15 minute interval?
Assuming it's the nearest, something like this does what you want.
#!/usr/bin/perl
use strict;
use warnings;
use constant FIFTEEN_MINS => (15 * 60);
my $now = time;
if (my $diff = $now % FIFTEEN_MINS) {
if ($diff < FIFTEEN_MINS / 2) {
$now -= $diff;
} else {
$now += FIFTEEN_MINS - $diff;
}
}
print scalar localtime $now, "\n";
An easy solution is to use Math::Round from CPAN.
use strict;
use warnings;
use 5.010;
use Math::Round qw(nearest);
my $current_quarter = nearest(15*60, time());
say scalar localtime($current_quarter);
Minor variation on first answer using sprintf instead of ceil and POSIX. Also does not use any additional CPAN modules. This rounds up or down so 6:07 = 6:00, 6:08 = 6:15, 6:22 = 6:15 and 6:23 = 6:30. Note that a hour is added if the rounded minutes equal 60. However to do this properly, you would have to use a timelocal and localtime functions to add the hour. i.e. adding an hour may add a day, month or year.
#!/usr/bin/perl
my ($hr,$min) = split/:/,$time;
my $interimval = ($min/15);
my $rounded_min = sprintf "%.0f", $interimval;
$rounded_min = $rounded_min * 15;
if($rounded_min == 60)
{
$rounded_min = 0;
$hr++;
$hr = 0 if($hr == 24);
}
精彩评论