如何制作百分之一秒精度的秒表



我正试图制作一个精度为千分之一秒的秒表。我有一个每10毫秒运行一次的代码,但我在将它转换为0(分钟(:0(秒(:00格式时遇到了问题。

timer.post(new Runnable() {
@Override
public void run() {
time += 1;
txtView.setText(convertTimeToText(time));
timer.postDelayed(this, 10);
}
});
private String convertTimeToText(int time) {
String convertedTime = time / 6000 + ":" + (time / 100) % 60
+ ":" + (time / 10) % 10 + time % 10;
return convertedTime;
}

我需要convertTimeToText(int-time({}的帮助,它可以格式化时间。

编辑:感谢Ole V.V.和WJS提供的格式化答案以及如何修复我的延迟,如果有人需要的话,这就是我想出的代码,到目前为止,它运行得很好,也许使用System.nanoTime((会得到更准确的结果,但对我来说,它很好。

public void start(){
final long timeMillisWhenStarted = System.currentTimeMillis();
if(!isRunning){
isRunning = true;
timer.post(new Runnable() {
@Override
public void run() {
long millisNow = System.currentTimeMillis();
long time = millisNow - timeMillisWhenStarted;
yourtxtView.setText(convertTimeToText(time));
timer.postDelayed(this, 10);
}
});
}
}
private String convertTimeToText(long time){
long hundredths = time  / 10;
long sec = hundredths / 100;
long min = sec / 60;
return String.format("%02d:%02d.%02d", min % 60, sec % 60, hundredths % 100);
}

看看这是否有帮助。余数计算不正确。

  • 对于12340 hundreds秒,则为123.40 seconds
  • 所以12340 / 60002分钟
  • 12340 % 6000得到剩余的340
  • 所以340 /1003
  • 离开340 % 100=40的百分之一
public static void main(String[] args) {
// n = 16 mins 4 seconds and 99 hundredths
int n = (16 * 6000) + (4 * 100) + 99;
System.out.println(convertTimeToText(n));
}
private static String convertTimeToText(int time) {
int mins = time / 6000;
time %= 6000; // get remaining hundredths
int seconds = time / 100;
int hundredths = time %= 100; // get remaining hundredths
// format the time.  The leading 0's mean to pad single
// digits on the left with 0.  The 2 is a field width
return String.format("%02d:%02d:%02d", mins, seconds,
hundredths);
}

这将打印

16:04:99

使用标准库

你的计时器不准确。你观察到的延误就是从那里来的。每次读取某个时钟的时间,而不是增加1/100秒。例如使用System.currentTimeMillis()System.nanoTime()Instant.now()。保持秒表启动时的读数,并减去以获得当前秒表值。

如果每秒执行100次系统调用太贵(我没想到(,例如每30次就执行一次,以将秒表调整回正确的时间。

接下来,如果您使用的是Java 9或更高版本,请使用Duration类将时间(无论是毫秒还是纳秒(转换为分秒。如果你在尝试的时候用手进行转换,它很容易出错,而且很难阅读,我相信这是你提出问题的原因之一。

例如:

long millisNow = System.currentTimeMillis();
Duration time = Duration.ofMillis(millisNow - timeMillisWhenStarted);
String convertedTime = String.format("%d:%02d.%02d",
time.toMinutes(), time.toSecondsPart(), time.toMillisPart() / 10);

最新更新