2011-09-03 11 views
24

Sto lavorando su un progetto che richiede un tempo futuro da impostare utilizzando l'oggetto Date.Come arrotondare all'ora più vicina utilizzando JavaScript Data Oggetto

Ad esempio:

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

Le mie domande è; una volta impostata la data futura, come posso arrotondare all'ora intera più vicina e quindi impostare la variabile futureTime con esso?

Ad esempio:

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

Qualsiasi aiuto sarebbe apprezzato!

risposta

39

rotonda i minuti e poi cancellare i minuti:

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

Molto bello; grazie! – dSquared

+3

Questo potrebbe non essere corretto a seconda di cosa ti aspetti. Per esempio. se il tempo è 4: 55: 23.100 (o 4:55 e 23 secondi, 100 millisecondi), allora questa funzione imposta il tempo su 5: 00: 23.100 (o 5:00 e 23 secondi e 100 millisecondi). –

+1

Questo non è corretto non solo a causa di ciò che @Felix ha scritto, ma anche perché non si utilizzano le funzioni Date UTC che possono portare a comportamenti buggy durante il cambio di orario in estate e ritorno (il risultato sarà diverso nei vari browser) . – ivoszz

2

un'altra soluzione, che è dove vicino come grazioso come di IAbstractDownvoteFactory

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

Un modo un po 'più semplice:

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

Mi piace, è semplice e cambierà anche l'oggetto data invece di restituire semplicemente una rappresentazione. – rlemon

+0

Questo è fantastico. Grazie. – Waymond

+0

Nota: ciò potrebbe non essere corretto a seconda di cosa ci si aspetta. Per esempio. se il tempo è 4: 55: 23.100 (o 4:55 e 23 secondi, 100 millisecondi), allora questa funzione imposta l'ora su 5: 00: 23.100 (o 5:00 e 23 secondi e 100 millisecondi) –

2

Oppure puoi combinare i due per la dimensione ottimale. http://jsfiddle.net/HkEZ7/

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

Le altre risposte ignorano secondi e millisecondi componenti della data. Vorrei fare qualcosa di simile:

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

concordo, Ho anche trovato più semplice lavorare con il tempo in millisecondi (numeri), tutto quindi diventa semplicemente matematica di base – kkemple

+1

+1 per restare fedeli alla matematica del millisecondo. Comunque vale la pena notare che l'uso di 'Math.ceil' si arrotonda sempre e non ti dà _nearest hour_ come specificato nella domanda. –

+1

Grazie a @MarkEdington! Ho aggiornato il codice per arrotondare all'ora più vicina anziché arrotondare. –

Problemi correlati