2010-10-11 10 views

cevap

11

Sen saat ve dakika içine zaman bölünmüş ve daha sonra da ceil işlevini kullanabilirsiniz: 6:07 için

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

düzgün, ancak 12:58 Øyvind Skaar @ 12:60 ve 13:00 :-( –

+0

olacak: işaret için teşekkürler şimdi Sabit – codaddict

8

en yakın 15 dakikalık aralık 06:00, değil 6:15. En yakın 15 dakikalık aralık veya sonraki 15 dakikalık aralıkları mı istiyorsunuz?

En yakın olduğunu varsayarsak, bunun gibi bir şey yapar.

#!/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' gerçekten kötü bir isim sabit içindir.. Bu eşittir 900. :) – friedo

+0

Sabit, şu anda $ $ + = (15 * 60) - $ diff; – MikeKulls

4

kolay bir çözüm CPAN Math::Round kullanmaktır.

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

Tavan ve POSIX yerine sprintf kullanarak ilk cevapta küçük değişiklikler. Ayrıca herhangi bir ek CPAN modülü kullanmaz. Bu yukarı ya da aşağı yuvarlar yani 6:07 = 6:00, 6:08 = 6:15, 6:22 = 6:15 ve 6:23 = 6:30. Eğer yuvarlanmış dakikalar 60'a eşit ise bir saatin eklendiğini unutmayın. Ancak bunu doğru yapmak için, saati eklemek için bir zaman çizelgesi ve yerel saat işlevleri kullanmanız gerekir. Yani, bir saat ekleyerek bir gün, ay veya yıl ekleyebilir.

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

    }