2011-09-03 49 views
24

Estoy trabajando en un proyecto que requiere un tiempo en el futuro para establecerse mediante el objeto Date.Cómo redondear a la hora más cercana utilizando JavaScript Fecha Object

Por ejemplo:

futureTime = new Date(); 
futureTime.setHours(futureTime.getHours()+2); 

Mi pregunta es; una vez que se establece la fecha futura, ¿cómo puedo redondear a la hora completa más cercana y luego configurar la variable futureTime con ella?

Por ejemplo:

Given 8:55 => var futureTime = 9:00 
Given 16:23 => var futureTime = 16:00 

Cualquier ayuda se agradece!

Respuesta

39

Ronda de los minutos y luego limpiar los minutos:

var date = new Date(2011,1,1,4,55); // 4:55 
roundMinutes(date); // 5:00 

function roundMinutes(date) { 

    date.setHours(date.getHours() + Math.round(date.getMinutes()/60)); 
    date.setMinutes(0); 

    return date; 
} 
+0

Muy bonito; ¡gracias! – dSquared

+3

Esto puede ser incorrecto dependiendo de lo que esperas. P.ej. si el tiempo es 4: 55: 23.100 (o 4:55 y 23 segundos, 100 milisegundos), esta función establecerá el tiempo en 5: 00: 23.100 (o 5:00 y 23 segundos y 100 milisegundos). –

+1

Esto es incorrecto no solo por lo que @Felix ha escrito, sino también porque no utiliza las funciones de Fecha UTC que pueden provocar un comportamiento defectuoso durante el cambio de horario a verano y viceversa (el resultado será diferente en diferentes navegadores) . – ivoszz

2

Otra solución, que es ni de cerca tan elegante como de IAbstractDownvoteFactory

var d = new Date(); 
if(d.getMinutes() >= 30) { 
    d.setHours(d.getHours() + 1); 
} 
d.setMinutes(0); 
15

Una forma un poco más simple:

var d = new Date(); 
d.setMinutes (d.getMinutes() + 30); 
d.setMinutes (0); 
+0

Me gusta esto, es simple y también cambiará el objeto de fecha en lugar de simplemente devolver una representación. – rlemon

+0

Esto es asombroso. Gracias. – Waymond

+0

Nota: Esto puede ser incorrecto dependiendo de lo que esperas. P.ej. si el tiempo es 4: 55: 23.100 (o 4:55 y 23 segundos, 100 milisegundos), esta función establecerá el tiempo en 5: 00: 23.100 (o 5:00 y 23 segundos y 100 milisegundos) –

2

O podría mezclar los dos para un tamaño óptimo. http://jsfiddle.net/HkEZ7/

function roundMinutes(date) { 
    return date.getMinutes() >= 30 ? date.getHours() + 1 : date.getHours(); 
} 
7

Las otras respuestas ignoran los segundos y milisegundos componentes de la fecha. Haría algo como esto:

function roundToHour(date) { 
    p = 60 * 60 * 1000; // milliseconds in an hour 
    return new Date(Math.round(date.getTime()/p) * p); 
} 

var date = new Date(2011,1,1,4,55); // 4:55 
roundToHour(date); // 5:00 

date = new Date(2011,1,1,4,25); // 4:25 
roundToHour(date); // 4:00 
+0

acepto, También me resulta más fácil trabajar con el tiempo en milisegundos (números), todo se convierte en matemática básica – kkemple

+1

+1 para pegar en milisegundos matemáticos. Sin embargo, vale la pena señalar que el uso de 'Math.ceil' siempre va a redondear y no le dará la hora más adecuada, como se especifica en la pregunta. –

+1

¡Gracias @MarkEdington! He actualizado el código para redondear a la hora más cercana en lugar de redondear. –

Cuestiones relacionadas