如何在Perl中将日期舍入到最近的15分钟间隔?

时间:2010-10-11 15:22:07

标签: perl datetime

我想将当前时间缩短到最近的15分钟间隔。
因此,如果它当前为6:07,则会将6:15作为开始时间。

我该怎么做?

4 个答案:

答案 0 :(得分:11)

您可以将时间分为小时和分钟,然后将ceil功能用作:

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); 
}

答案 1 :(得分:8)

距离6:07最近的15分钟是6:00,而不是6:15。您想要最近的15分钟间隔或下一个15分钟的间隔吗?

假设它是最近的,这样的东西可以做你想要的。

#!/usr/bin/perl

use strict;
use warnings;

use constant FIFTEEN => (15 * 60);

my $now = time;

if (my $diff = $now % FIFTEEN) {
  if ($diff < FIFTEEN / 2) {
    $now -= $diff;
  } else {
    $now += (15*60) - $diff;
  }
}

print scalar localtime $now, "\n";

答案 2 :(得分:4)

一个简单的解决方案是使用CPAN中的Math::Round

use strict;
use warnings;
use 5.010;

use Math::Round qw(nearest);

my $current_quarter = nearest(15*60, time());
say scalar localtime($current_quarter);

答案 3 :(得分:0)

使用sprintf代替ceil和POSIX的第一个答案的微小变化。也不使用任何其他CPAN模块。这个向上或向下舍入到6:07 = 6:00,6:08 = 6:15,6:22 = 6:15和6:23 = 6:30。请注意,如果舍入分钟等于60,则会添加一小时。但要正确执行此操作,您必须使用timelocal和localtime函数来添加小时。即增加一小时可以增加一天,一个月或一年。

  #!/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); 

  }