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

Lau*_*ise -3 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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

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

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

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

这两种格式都使用相同的时区,其中至少有某种避免出现问题.然而:

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

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

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

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