【问题标题】:How to build stopwatch with hundreth of a second precision?如何制作精度达到百分之一秒的秒表?
【发布时间】:2020-04-16 18:04:24
【问题描述】:

我正在尝试制作一个精度为 100 秒的秒表。我有此代码每 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);

        }

【问题讨论】:

  • @Nicknackd 请不要在 cmets 中发布您的代码。只需编辑您的帖子以响应建议的编辑。
  • 您需要什么样的帮助。它怎么没有像你预期的那样工作?
  • 我希望这可以工作,但是当我执行程序时,我得到一个一致的累积延迟,我无法找出原因。
  • 顺便说一句,世界上大多数用户都希望在秒和秒的小数部分之间使用小数分隔符(点或逗号),而不是冒号。
  • 感谢您提供自己的解决方案。两个建议:(1)将其作为答案发布,而不是作为对您问题的编辑。更多的人会找到它,它会更有帮助。 (2) 只考虑min 而不是min % 60。因此,当时间超过 1 小时时,分钟将继续 60、61、……而不是回到 0。我认为它不会那么混乱。

标签: java time datetime-format runnable


【解决方案1】:

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

  • 对于 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

【讨论】:

    【解决方案2】:

    使用标准库

    您的计时器不准确。您观察到的延迟来自那里。每次读取某个时钟的时间,而不是增加 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多