如何制作精度达到百分之一秒的秒表?
How to build stopwatch with hundreth of a second precision?
我正在尝试制作一个精度为百分之一的秒表。我的代码每 10 毫秒运行一次,但我无法将其转换为 0(min):0(sec):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 / 6000
= 2
分钟
12340 % 6000
得到剩下的 340
- 所以
340 /100
=3
秒
- 留下
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
class 将时间(无论是毫秒还是纳秒)转换为分钟和秒。如果您在尝试时手动进行转换,则容易出错且难以阅读,我相信这是您提出问题的原因之一。
例如:
long millisNow = System.currentTimeMillis();
Duration time = Duration.ofMillis(millisNow - timeMillisWhenStarted);
String convertedTime = String.format("%d:%02d.%02d",
time.toMinutes(), time.toSecondsPart(), time.toMillisPart() / 10);
我正在尝试制作一个精度为百分之一的秒表。我的代码每 10 毫秒运行一次,但我无法将其转换为 0(min):0(sec):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 / 6000
=2
分钟 12340 % 6000
得到剩下的340
- 所以
340 /100
=3
秒 - 留下
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
class 将时间(无论是毫秒还是纳秒)转换为分钟和秒。如果您在尝试时手动进行转换,则容易出错且难以阅读,我相信这是您提出问题的原因之一。
例如:
long millisNow = System.currentTimeMillis();
Duration time = Duration.ofMillis(millisNow - timeMillisWhenStarted);
String convertedTime = String.format("%d:%02d.%02d",
time.toMinutes(), time.toSecondsPart(), time.toMillisPart() / 10);