毫秒,直到第5秒

时间:2011-07-26 18:58:23

标签: java

所以我想做一些监控,我希望它每隔五分钟一次,所以例如如果应用程序从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);

有人能想出类似于上面的方法来获得最接近的第五分钟的毫秒数吗?

4 个答案:

答案 0 :(得分: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();

<强>更新 恢复到我的初始变体。它充当魅力。当设置为大于60的分钟值时,宽容日历(currentCalendar是宽松的)可以正常工作。来自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.
 */

答案 1 :(得分: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。然后你得到它和当前毫秒之间的差异,找出你离它多少毫秒。

答案 2 :(得分:1)

为什么不使用Quartz,它可以轻松处理这类事情。对于上面的内容,您可以指定一个cron类型的表达式。

对于您的初始要求,它可能看起来有点重量级,但它可以扩展,因此它可以处理任何未来的要求。

答案 3 :(得分:0)

将五分钟添加到当前时间,然后将秒和毫秒设置为零。

请注意,重要的是使用.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);