开发者

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.

So if it is currently 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); 

  }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜