2011-09-03 45 views
24

我正在使用Date對象設置將來需要時間的項目。如何使用JavaScript日期對象舍入到最近的小時數

例如:

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

我的問題是;一旦設定了未來日期,我怎樣才能達到最近的整整一小時,然後用它設置futureTime var?

例如:

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

任何幫助,將不勝感激!

回答

39

分鐘回合,然後清除分鐘:

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

非常好;謝謝! – dSquared

+3

這可能是不正確的,取決於你的期望。例如。如果時間是4:55:23.100(或4:55和23秒,100毫秒),則此功能將時間設置爲5:00:23.100(或5:00和23秒和100毫秒)。 –

+1

這不正確不僅因爲@Felix編寫的內容,而且因爲您不使用Date UTC功能,這可能會導致在夏令時間和返回時間發生變化時產生錯誤行爲(結果在不同瀏覽器中會有所不同) 。 – ivoszz

2

另一種解決方案,這是沒有在附近的IAbstractDownvoteFactory的

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

A作爲優雅稍微簡單的方法:

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

我喜歡這個,它很簡單,它也會改變日期對象而不是簡單地返回一個表示。 – rlemon

+0

這太棒了。謝謝。 – Waymond

+0

注意:這可能不正確,取決於您的期望。例如。如果時間是4:55:23.100(或4:55和23秒,100毫秒),那麼此功能將設置時間爲5:00:23.100(或5:00和23秒和100毫秒) –

2

或者您可以將兩者混合以獲得最佳尺寸。 http://jsfiddle.net/HkEZ7/

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

其他的答案忽略的時間的秒和毫秒組件。我會做這樣的事情:

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

我同意,我也發現用毫秒(數字)來處理時間更容易,然後一切都變成基本的數學運算 – kkemple

+1

+1以堅持毫秒數學。但值得注意的是,Math.ceil的使用將總是取整,而不是像問題中指定的那樣給你最近的hour_。 –

+1

謝謝@MarkEdington!我已經更新了代碼,以便輪到最近的小時而不是總結。 –

相關問題