2010-10-11 36 views

Répondre

11

Vous pouvez diviser le temps en heures et en minutes, puis utilisez la fonction ceil comme:

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

propre, mais deviendront 12:58 12:60 13:00 et non :-( –

+0

@ Øyvind Skaar: Merci de remarquer fixe maintenant – codaddict

8

Le à 06h07 est intervalle de 15 minutes le plus proche 06h00, et non 06h15. Voulez-vous l'intervalle de 15 minutes le plus proche ou l'intervalle de 15 minutes suivant?

En supposant que c'est le plus proche, quelque chose comme ça fait ce que vous voulez.

#!/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' est un nom vraiment mauvais pour une constante.. cela vaut 900. :) – friedo

+0

La constante n'est pas utilisée dans la ligne '$ now + = (15 * 60) - $ diff;' – MikeKulls

4

Une solution simple est d'utiliser Math::Round de 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

Variation mineure de la première réponse en utilisant sprintf au lieu de ceil et POSIX. N'utilise pas non plus de modules CPAN supplémentaires. Cela arrondit vers le haut ou vers le bas si 6:07 = 6:00, 6:08 = 6:15, 6:22 = 6:15 et 6:23 = 6:30. Notez qu'une heure est ajoutée si les minutes arrondies sont égales à 60. Cependant, pour le faire correctement, vous devez utiliser une fonction timelocal et une heure locale pour ajouter l'heure. c'est-à-dire ajouter une heure peut ajouter un jour, un mois ou une année.

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

    } 
Questions connexes