2011-07-26 19 views
1

私はいくつかの監視をしたいと思います。たとえば、アプリケーションが1:47に開始すると、1分50秒にすべてを監視してからリセットします。私は現在、この作業を1時間続けていますが、5分ごとにそれを切り捨てる必要があり、私は数学を思いつくのに少し問題があります。私は現在時刻情報の全て次の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); 

誰も上記と同様の方法を考えて、最も近い5分にミリ秒を得ることができますか?

答えて

2

毎分5 minutes * 60 seconds/minute * 1000 millisecond/second = 300,000 millisecondsです。

は、これを試してみてください:最寄り300,000まで

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

+299999)/300000*300000ラウンド。次に、現在のミリ秒との差を求めて、そこから何ミリ秒離れているかを調べます。

+0

私はこれを正しい答えとして選びました。なぜなら、それは他のコードと最もよく合っていて、最も速いからです。これでオブジェクトを再作成する必要はありませんが、カレンダーインスタンスを再利用する必要がある場合は必要でした。みんなありがとう。 – Ryan

+0

@ライアン:私の数学をチェックしてテストしてください。私はかなり素早くそれを書いていたので、不注意な間違いがあるかもしれません。しかし、一般的な方法は正しいです。 – 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(); 

アップデート:私の最初のバリアントに差し戻し 。それは魅力として働く。期待通りのjavadocから60より大きい分値として設定するときに寛大なカレンダーは(currentCalendarが寛大である)完璧に動作します:

/** 
* 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

はゼロに秒およびミリ秒を設定し、現在の時間に5分を追加します。

重要なことは、.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);