日历秒数在while循环中没有增加

时间:2019-06-02 23:20:00

标签: java calendar

我试图在5秒半(5.5)之后使while循环停止,所以我正在使用Calendar库获取分钟的当前秒数,然后在其上增加5.5。完成该过程后,循环运行,等待当前时间等于已保存的变量

我意识到秒数并没有增加……为什么?

代码:

package me.fangs.td;

import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        double timeout = calendar.get(Calendar.SECOND) + 5.5;
        while((double) calendar.get(Calendar.SECOND) < timeout) {
            System.out.println((double) calendar.get(Calendar.SECOND));
            Thread.sleep(1000);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

我宁愿/使用Timer而不是自己动手,flask CLI一种用于线程在后台线程中调度任务以备将来执行的工具。

Timer t = new Timer();
TimerTask task = new TimerTask() {
    @Override
    public void run() {
        System.out.println("Five seconds");
    }
};
t.schedule(task, TimeUnit.SECONDS.toMillis(5) + 500); // 5.5 seconds.

答案 1 :(得分:2)

我根本不会使用日历库,而是使用System.currentTimeMillis()

这是一个while循环,在5.5秒后终止:

long end = System.currentTimeMillis() + 5500;
while (System.currentTimeMillis() < end) {
  //Do something
}
//Exit after 5.5 seconds

此版本的优点是,您可以在循环运行时更改结束时间,从而更改循环运行的时间。

答案 2 :(得分:1)

java.time

Answer by VoroX是正确的。但是使用java.time使其更加优雅和具有自说明性。

我们每次通过循环调用TestFlight来捕获新的当前时间。日期时间对象不会自动更新。它们是那一刻的快照,被冻结了。在每种情况下都需要询问当前时间。

roduction push certificate

在实际工作中,我还添加了一个Instant.now复选框,以防将工期修改为负数。