Quiero redondear la hora actual al intervalo de minutos 15
más cercano.
Entonces, si actualmente es 6:07
, leería 6:15
como hora de inicio.¿Cómo puedo redondear una fecha al intervalo de 15 minutos más cercano en Perl?
¿Cómo puedo hacer eso?
Quiero redondear la hora actual al intervalo de minutos 15
más cercano.
Entonces, si actualmente es 6:07
, leería 6:15
como hora de inicio.¿Cómo puedo redondear una fecha al intervalo de 15 minutos más cercano en Perl?
¿Cómo puedo hacer eso?
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);
}
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";
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);
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);
}
ordenado, pero se convertirá 12:58 12:60 y 13:00 no :-( –
@ Øyvind Skaar: Gracias por señalar fija ahora – codaddict