2010-10-11 81 views

回答

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

整齊,但12:58將成爲12:60和13:00 :-( – 2010-10-12 12:19:23

+0

@島之風Skaar:感謝您指出現在修好了 – codaddict 2010-10-12 12:28:30

8

最近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"; 
+8

'FIFTEEN'是一個非常糟糕的名字恆定。等於900. :) – friedo 2010-10-11 16:55:28

+0

這個常量沒有用在'$ now + =(15 * 60) - $ diff;'行 – MikeKulls 2015-09-02 06:31:47

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

    } 
相關問題