有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java毫秒,直到下一个第5秒

所以我想做一些监视,我希望它每五分钟打开一次,例如,如果应用程序在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) 个答案

  1. # 1 楼答案

    使用问题中描述的相同方法:

     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时,Lenient calendar(currentCalendar为Lenient)将完全按照预期工作。从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.
     */
    
  2. # 2 楼答案

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

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

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

    对于您最初的需求来说,它似乎有点重,但它是可伸缩的,所以它可以处理任何未来的需求

  4. # 4 楼答案

    每五分钟一次

    那么试试这个:

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

    +299999)/300000*300000四舍五入到最接近的300000。然后得到它和当前毫秒之间的差值,以确定离它还有多少毫秒