2010-10-11 14 views

Respuesta

11

Se puede dividir el tiempo en horas y minutos y luego usar la función ceil como:

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

ordenado, pero se convertirá 12:58 12:60 y 13:00 no :-( –

+0

@ Øyvind Skaar: Gracias por señalar fija ahora – codaddict

8

El intervalo de 15 minutos más cercana a 6:07 es 06:00, no 6:15. ¿Desea el intervalo de 15 minutos más cercano o el siguiente intervalo de 15 minutos?

Suponiendo que es el más cercano, algo como esto hace lo que quiere.

#!/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' es un nombre muy malo para una constante.. eso equivale a 900. :) – friedo

+0

La constante no se usa en la línea '$ now + = (15 * 60) - $ diff;' – MikeKulls

4

Una solución fácil es usar 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

Pequeña variación en la primera respuesta usando sprintf en lugar de ceil y POSIX. Además, no utiliza ningún módulo de CPAN adicional. Esto redondea hacia arriba o hacia abajo, de modo que 6:07 = 6:00, 6:08 = 6:15, 6:22 = 6:15 y 6:23 = 6:30. Tenga en cuenta que se agrega una hora si los minutos redondeados equivalen a 60. Sin embargo, para hacer esto correctamente, debe usar las funciones de tiempo real y tiempo local para agregar la hora. es decir, agregar una hora puede agregar un día, mes o año.

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

    } 
Cuestiones relacionadas