2011-07-26 104 views
1

所以我想做一些監測,我希望它每隔五分鐘,所以例如,如果應用程序在1:47開始監測一切,直到1:50,然後重置。我現在有這個工作小時,但我需要把它減少到每隔五分鐘,我有一點點麻煩來計算數學。毫秒,直到下一個第5秒

我得到的所有的當前時間信息

Calendar currentCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
    long currentTimeInMillis = currentCalendar.getTimeInMillis(); 
    int hr = currentCalendar.get(Calendar.HOUR_OF_DAY); 
    int min = currentCalendar.get(Calendar.MINUTE); 
    int sec = currentCalendar.get(Calendar.SECOND); 
    int millis = currentCalendar.get(Calendar.MILLISECOND); 

現在我需要找到下一個五分鐘,爲小時我有這個其中工程。

millisUntilNextHour = currentTimeInMillis + ((60L - min) * SECONDS_IN_MINUTE * 1000L) + ((60 - sec) * 1000L) + (1000L - millis); 

任何人都可以想到類似於上面的方法來獲得毫秒到最接近的第五分鐘嗎?

回答

2

每五分鐘是5 minutes * 60 seconds/minute * 1000 millisecond/second = 300,000 milliseconds

試試這個,然後:

millisUntilNextHour = (min*60*1000 + sec*1000 + millis + 299999)/300000*300000 - (min*60*1000 + sec*1000 + millis) 

+299999)/300000*300000發到最近的300,000。然後你可以看到它與當前毫秒之間的差異,以確定你離它有多少毫秒。

+0

我選擇這個作爲正確的答案,因爲它與我的其他代碼一起最好,也是最快的。我不必重新創建任何對象,但如果需要重新使用Calendar實例,則必須重新創建對象。謝謝大家。 – Ryan

+0

@Ryan:請檢查我的數學並測試它。我寫得很快,所以很可能是粗心的錯誤。但一般的方法是正確的。 – tskuzzy

+0

是的,我在回答之前測試過它,像魅力一樣。我只需要在應用程序啓動時進行第一次傳遞,之後我會有一個計時器每隔300,000毫秒啓動一次更新。 – Ryan

1

爲什麼不使用Quartz,它可以輕鬆處理這類事情。對於上面的你可以指定一個cron類型的表達式。

它可能看起來有點重量級爲您的最初要求,但它是可擴展的,因此它將處理任何未來的要求。

+3

這不是一個直接的投訴,但任何時間相關的問題很快就會收到一個使用「X」的答案,而不是「這裏是你如何用X答案來做這件事」。雖然將一個人引導到一個新的工具包可能是正確的,但是如果不在新工具包下提供問題的答案,那麼這個問題仍然沒有答案。 –

+0

我們正在構建的應用程序將會非常繁重,並且意味着儘可能快,我們考慮使用Quartz,但是我們確實發現它對我們的應用程序來說有點太沉重。 – Ryan

2

使用中的問題描述相同的方法:

Calendar currentCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
int min = currentCalendar.get(Calendar.MINUTE); 
currentCalendar.set(Calendar.MINUTE, 5 * (min/5 + 1)); 
currentCalendar.set(Calendar.SECOND, 0); 
currentCalendar.set(Calendar.MILLISECOND, 0); 

millisUntilNextHour = currentCalendar.getTimeInMillis(); 

更新: 歸還給我的最初的變種。它充當魅力。

/** 
* With lenient interpretation, a date such as "February 942, 1996" will be 
* treated as being equivalent to the 941st day after February 1, 1996. 
* With strict (non-lenient) interpretation, such dates will cause an exception to be 
* thrown. The default is lenient. 
*/ 
+0

據我所知,它會在X出現一個很好的錯誤:55+ – Voo

+0

是的,這是一個幾乎正確的解決方案,最終保證會失敗。 –

+0

誰在乎,只會在42分鐘內失敗:)。工作91%的時間 – Andrey

0

添加五分鐘當前時間,然後設置秒和毫秒時間爲零:寬鬆日曆(currentCalendar是寬鬆)的分鐘值大於60的設置從javadoc的時候完美的作品如預期。

請注意,重要的是使用.add(field, amount)方法,因爲它會正確滾動到下一個小時等(包括夏令時等)。

Calendar currentCalendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
// store off the milliseconds from the epoch 
int startTime = currentCalendar.getTime().getTime(); 
currentCalendar.add(Calendar.MINUTE, 5); 
currentCalendar.set(Calendar.SECOND, 0); 
currentCalendar.set(Calendar.MILLISECOND, 0); 

// calculate the milliseconds difference. 
int difference = currentCalendar.getTime().getTime() - startTime; 
System.out.println("The number of milliseconds till " + currentCalendar.getTime() + " is " + startTime);