所以我想做一些监控,我希望它每隔五分钟开启一次,所以,例如,如果应用程序在1:47开始,监控一切直到1:50,然后重置。我现在已经工作了一个小时,但是我需要把它减少到每五分钟一次,我在计算数学方面有点困难。
我得到了所有的当前时间信息
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 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。然后你得到它和当前毫秒之间的差值,以找出你离它有多少毫秒。
使用与问题中描述的相同的方法:
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();
更新:恢复到我最初的变体。它很有魅力。宽大的日历(currentCalendar是宽大的)在设置分钟值大于60时完全按照预期工作。从javadoc:
/**
* 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.
*/
为什么不使用Quartz呢?它可以很容易地处理这类事情。对于上面的表达式,可以指定一个克隆类型的表达式。
对于您的初始需求来说,它可能看起来有点重量级,但它是可伸缩的,因此它可以处理任何未来的需求。
将当前时间增加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);