如何从 Java 摆动计时器计算经过的时间



我有一个来自javax.swing.Timer的Timer 实例,我正在尝试计算冷却时间的剩余时间,因为我将其用于命令。

我正在用 15 秒的冷却时间测试它。冷却时间工作正常,但我希望能够发布当我到达更大的冷却时间(如 5 - 10 分钟等(时还剩多少时间。 我想说像 00:00:15 剩余 剩余 00:00:14 剩余 00:00:13 等

我知道我在这里错过了一些东西。

下面我放了代码 im 用来计算经过的时间以及从 Millis 到 HMS 的转换 调用命令时,开始时间设置为 currentTimeMillis((

long startTime = System.currentTimeMillis();
public void callWithCooldown(int cooldown) {
ActionListener callMethod = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
enable();
}
};
boolean didCall = call();
if(!didCall) return;
disable();
this.timer = new Timer(cooldown, callMethod);
timer.setRepeats(false);
this.startTime = System.currentTimeMillis();
timer.start();
String notification = "Cooldown activated for " + MathHelper.millisecondsToHMS(cooldown) + "!";
System.out.println(notification);
notify(notification);
}
public String elapsedTime() {
long now = System.currentTimeMillis();
long endTime = (startTime + cooldown);
int elapsed = (int) (endTime - now);
System.out.println(elapsed);
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;
}

您可以创建两个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) {}
}
}

虽然我认为Timer并不是解决此类问题的最准确解决方案(取决于您希望它的准确性(,但这是一个简单的解决方案。

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

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) {}
}
}

最新更新