如何计算Java Swing计时器的运行时间

如何计算Java Swing计时器的运行时间,java,swing,time,Java,Swing,Time,我有一个javax.swing.Timer中的计时器实例,我试图计算冷却后的剩余时间,因为我将它用于命令 我用15秒的冷却时间来测试它。冷却效果很好,但我想能够张贴多少时间是剩余的,当我得到更大的冷却,如5-10分钟等。 我想说喜欢 00:00:15剩余时间 00:00:14剩余时间 00:00:13剩余时间 等 我知道我错过了一些东西 下面是我用来计算运行时间和从毫秒到HMS的转换的代码 调用该命令时,开始时间设置为currentTimeMillis() 您可以创建两个Timer对象。一个用于

我有一个javax.swing.Timer中的计时器实例,我试图计算冷却后的剩余时间,因为我将它用于命令

我用15秒的冷却时间来测试它。冷却效果很好,但我想能够张贴多少时间是剩余的,当我得到更大的冷却,如5-10分钟等。 我想说喜欢 00:00:15剩余时间 00:00:14剩余时间 00:00:13剩余时间 等

我知道我错过了一些东西

下面是我用来计算运行时间和从毫秒到HMS的转换的代码 调用该命令时,开始时间设置为currentTimeMillis()


您可以创建两个
Timer
对象。一个用于总等待时间,一个用于倒计时:

import javax.swing.Timer;

public class Main {

    private static long START;

    public static void main(final String[] args) {
        final int totalSeconds = 15;

        final Timer tm = new Timer(1000, e -> {
            System.out.println("Seconds remaining: " + (totalSeconds * 1000 - System.currentTimeMillis() + START) / 1000d);
        });

        START = System.currentTimeMillis();

        new Timer(totalSeconds * 1000, e -> {
            tm.stop();
            System.out.println("Finished!");
        }).start();

        tm.start();

        //Wait for the program to execute:
        try { Thread.sleep((totalSeconds + 2) * 1000); } catch (final InterruptedException ix) {}
    }
}
虽然我认为定时器并不是解决这类问题的最准确的方法(取决于你希望它有多准确),但它很简单

或者在您的代码中,这可能是:

import java.util.concurrent.TimeUnit;
import javax.swing.Timer;

public class Main {
    private long startTime;
    private final Timer total, countDown;

    public Main() {
        countDown = new Timer(1000, e -> System.out.println(elapsedTime()));
        total = new Timer(2000, e -> { //Defaults to 2000 ms for example.
            countDown.stop();
            enable();
        });
        total.setRepeats(false);
    }

    public void enable() {
        System.out.println("Enable!");
    }

    public void callWithCooldown(int cooldownSeconds) {
        total.setInitialDelay(cooldownSeconds * 1000);
        startTime = System.currentTimeMillis();
        total.start();
        countDown.start();
    }

    public String elapsedTime() {
        long now = System.currentTimeMillis();
        long endTime = (startTime + total.getInitialDelay());
        int elapsed = (int) (endTime - now);
        return millisecondsToHMS(Math.abs(elapsed));
    }

    public static String millisecondsToHMS(int milliseconds) {
        String time = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds),
                TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)),
                TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
        return time;
    }

    public static void main(final String[] args) {
        final int seconds = 15;
        new Main().callWithCooldown(seconds);
        //Let the program run for 'seconds' seconds at least to show all messages:
        try { Thread.sleep((seconds + 2) * 1000); } catch (final InterruptedException ix) {}
    }
}

实际问题是什么?然后使用一个有1秒更新的计时器。我无法让它正确地告诉我还有多少时间。理想情况下无需使用第二个计时器。转换为HMS时,经过的时间仅返回“00:00:15剩余!”而没有返回任何其他内容。请添加一个带有输入、预期和观察到的输出。@DRAGONMASTER412很高兴这就是您要找的。@DRAGONMASTER412您也可以使用一个计时器来完成此操作(例如,每1秒倒计时一次,然后添加一个计数器以达到15)。但这将更加不准确(因为从打印倒计时时间中可以看出,计时器动作调用之间有2ms的小增量延迟)。因此,例如,在1小时后(使用单个计时器),即2ms/s将达到7200ms,依此类推。无论如何。@DRAGONMASTER412此延迟对于两个计时器来说不是真的,因为总计时器停止倒计时。这两个计时器现在唯一的问题是,在500次调用后的某个时间点,倒计时计时器将在打印语句中跳过整整一秒钟。这就是我打印的原因剩余秒数作为浮点数而不是整数的结果。
import java.util.concurrent.TimeUnit;
import javax.swing.Timer;

public class Main {
    private long startTime;
    private final Timer total, countDown;

    public Main() {
        countDown = new Timer(1000, e -> System.out.println(elapsedTime()));
        total = new Timer(2000, e -> { //Defaults to 2000 ms for example.
            countDown.stop();
            enable();
        });
        total.setRepeats(false);
    }

    public void enable() {
        System.out.println("Enable!");
    }

    public void callWithCooldown(int cooldownSeconds) {
        total.setInitialDelay(cooldownSeconds * 1000);
        startTime = System.currentTimeMillis();
        total.start();
        countDown.start();
    }

    public String elapsedTime() {
        long now = System.currentTimeMillis();
        long endTime = (startTime + total.getInitialDelay());
        int elapsed = (int) (endTime - now);
        return millisecondsToHMS(Math.abs(elapsed));
    }

    public static String millisecondsToHMS(int milliseconds) {
        String time = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds),
                TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)),
                TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
        return time;
    }

    public static void main(final String[] args) {
        final int seconds = 15;
        new Main().callWithCooldown(seconds);
        //Let the program run for 'seconds' seconds at least to show all messages:
        try { Thread.sleep((seconds + 2) * 1000); } catch (final InterruptedException ix) {}
    }
}