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

时间:2015-10-31 08:40:33

标签: java time-format

我有来自学校的这段代码,我似乎无法完全理解它在做什么。我知道它显示了一个单圈时间,就像来自运动的那样,以分钟,秒和毫秒换算,但我不明白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;
}

1 个答案:

答案 0 :(得分:5)

首先,在我看来,这是非常糟糕的代码。

它将原始ms值转换为字符串(因此35968将变为“35968”),然后将其解析为Date,就好像来自的格式>指定一个毫秒数......然后将其解释为“自格式化程序时区的Unix纪元以来的毫秒数”。

然后通过使用另一个Date格式化将SimpleDateFormat值转换为分钟/秒/毫秒格式。毫秒只被格式化为2个小数位,尽管在这里使用:作为分隔符而不是.很奇怪。 (它使它看起来像小时/分钟/秒值,而不是分钟/秒/毫秒。)

两种格式都使用相同的时区,至少排序可避免出现问题。但是:

  • 如果系统默认时区在Unix时代周围有过渡,那么仍然可能存在一些奇怪之处
  • 从根本上说,它试图通过将其视为日期和时间来格式化持续时间。这是一个坏主意
  • 异常“处理”是可笑的 - 如果在解析时抛出异常,则会打印第一个异常,并且NullPointerException将被以下行抛出,因为date仍然是空
  • 如果持续时间超过一小时,信息将默默丢失;目前还不清楚这里有什么样的行为
  • 即使您 希望以这种方式格式化它,使用new Date(ms)然后使用SimpleDateFormat格式化它并将时区设置为UTC也会更简单。这里不需要任何字符串解析

在不知道更多要求的情况下,我无法轻松提供更好的代码,但如果您尝试替换此代码,则应考虑:

  • 鉴于你有毫秒,你真的只需要几十毫秒的显示精度吗?
  • 如果ms为否定,您想做什么?
  • 如果ms代表一个多小时,您想做什么?
  • 你肯定希望:作为秒和毫秒之间的分隔符吗?

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