簡體   English   中英

如何在Perl中將日期舍入到最近的15分鍾間隔?

[英]How can I round a date to nearest 15 minute interval in Perl?

我想將當前時間縮短到最近的15分鍾間隔。
因此,如果它當前是6:07 ,它將以6:15作為開始時間。

我怎樣才能做到這一點?

您可以將時間分為小時和分鍾,然后使用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); 
}

距離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";

一個簡單的解決方案是使用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);

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

  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM