单圈时间格式化代码令人困惑
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".
然后通过使用另一个 SimpleDateFormat
将 Date
值格式化为 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
格式的好方法,这正是您在这里真正想要的。
我从学校得到了这段代码,但我似乎无法理解它到底在做什么。我知道它显示单圈时间,就像运动中的一样,以分钟、秒和毫秒为单位转换,但我不明白 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".
然后通过使用另一个 SimpleDateFormat
将 Date
值格式化为 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
格式的好方法,这正是您在这里真正想要的。