Как мне округлить дату до ближайшего 15-минутного интервала в Perl? - PullRequest
7 голосов
/ 11 октября 2010

Я хочу округлить текущее время до ближайшего 15 минутного интервала.
Так что, если оно в настоящее время 6:07, оно будет читать 6:15 как время начала.

Как я могу это сделать?

Ответы [ 4 ]

11 голосов
/ 11 октября 2010

Вы можете разделить время на часы и минуты, а затем использовать функцию 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); 
}
8 голосов
/ 11 октября 2010

Ближайший 15-минутный интервал до 6:07 - 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";
4 голосов
/ 11 октября 2010

Простым решением является использование 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);
0 голосов
/ 04 июля 2016

Незначительные отклонения при первом ответе с использованием 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); 

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...