代码之家  ›  专栏  ›  技术社区  ›  Bdfy

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

  •  7
  • Bdfy  · 技术社区  · 14 年前

    我想把现在的时间调到最近的 15 分钟间隔。
    所以如果现在是 6:07 它会读 6:15 作为开始时间。

    我该怎么做?

    4 回复  |  直到 8 年前
        1
  •  11
  •   codaddict    14 年前

    您可以将时间分为小时和分钟,然后使用 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); 
    }
    
        2
  •  8
  •   Dave Cross    14 年前

    距离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";
    
        3
  •  4
  •   mscha    14 年前

    一个简单的解决方案是使用 Math::Round 来自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);
    
        4
  •  0
  •   cccict    8 年前

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