单圈时间格式化代码令人困惑

Lap time formatting code is confusing

我从学校得到了这段代码,但我似乎无法理解它到底在做什么。我知道它显示单圈时间,就像运动中的一样,以分钟、秒和毫秒为单位转换,但我不明白 2 字符串变量是什么以及它们的作用。

代码如下:

public String getTimeFormat(long ms){
    String s1 = ""+ms;
    Date date = null;
    try {
        date = new SimpleDateFormat("SSS").parse(s1);
    } catch (ParseException e){
        e.printStackTrace();
    }
    String s2 = new SimpleDateFormat("mm:ss:SS").format(date);
    return s2;
}

首先,我认为这是非常糟糕的代码。

它将原始 ms 值转换为字符串(因此 35968 将变为“35968”),然后将其解析为 Date,就好像来自 的格式一样only 指定了一个毫秒数...然后被解释为 "the number of milliseconds since the Unix epoch in the formatter's time zone".

然后通过使用另一个 SimpleDateFormatDate 值格式化为 minutes/seconds/milliseconds 格式。毫秒仅格式化为小数点后两位,尽管在这里使用 : 而不是 . 作为分隔符很奇怪。 (它使它看起来像一个 hours/minutes/seconds 值,而不是 minutes/seconds/milliseconds。)

两种格式使用相同的时区,这至少某种避免了那里的问题。然而:

  • 如果系统默认时区在 Unix 纪元附近有转换,仍然会有一些奇怪的地方
  • 从根本上说,它试图通过将 duration 视为日期和时间来格式化它。这是个坏主意
  • 异常"handling"是可笑的-如果在解析时抛出异常,那么第一个异常将被打印出来,下面的行将抛出一个NullPointerException,如date 仍然为 null
  • 如果持续时间超过一个小时,信息将悄无声息地丢失;不清楚这里需要的行为是什么
  • 即使你确实想要这样格式化,使用new Date(ms)然后用SimpleDateFormat格式化会更简单时区设置为 UTC。这里不需要任何字符串解析

如果不了解更多要求,我无法轻易提供更好的代码,但如果您试图替换此代码,您应该考虑:

  • 既然你有毫秒,你确定只想要几十毫秒的显示精度吗?
  • 如果ms为负,你想做什么?
  • 如果ms代表一个多小时你想做什么?
  • 您确定要 : 作为秒和毫秒之间的分隔符吗?

然后您可能想使用 String.format 来格式化该值。不幸的是,Joda Time 和 Java 8 中的 java.time 都没有执行自定义 Duration 格式的好方法,这正是您在这里真正想要的。