【问题标题】:Lap time formatting code is confusing单圈时间格式代码令人困惑
【发布时间】:2015-10-31 08:40:33
【问题描述】:

我从学校得到了这段代码,但我似乎无法准确理解它在做什么。我知道它会显示单圈时间,就像运动中的那样,以分钟、秒和毫秒转换,但我不明白 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;
}

【问题讨论】:

  • 请你的老师读其他的java基础
  • 现在是学习一些基本java教程的最佳时机
  • 这里不是人们解决你作业的地方。
  • 没有迹象表明“理解这段代码”是家庭作业。 OP 正在尝试理解现有代码。我认为这是一个合理的问题,我自己。

标签: java time-format


【解决方案1】:

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

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

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

两种格式都使用相同的时区,这至少某种可以避免出现问题。然而:

  • 如果系统默认时区在 Unix 纪元前后发生了转换,仍然可能存在一些异常情况
  • 基本上它试图通过将其视为日期和时间来格式化持续时间。这是个坏主意
  • 异常“处理”是可笑的——如果在解析时抛出异常,则将打印第一个异常,并在下一行抛出NullPointerException,因为date仍然为null
  • 如果持续时间超过一个小时,信息会静默丢失;目前尚不清楚此处所需的行为是什么
  • 即使您确实想要以这种方式对其进行格式化,使用new Date(ms) 然后将其格式化为SimpleDateFormat 并将时区设置为UTC 会更简单。这里不需要任何字符串解析

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

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

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

【讨论】:

  • 好的,谢谢:) 它把日期弄糊涂了,但现在我明白了!非常感谢!
  • 我知道我正在转换,所以我按照您的建议使用了 new Date(ms) 和 SimpleDateFormat 并且它正在工作。还更改了分隔符:) 我不能有负 ms,因为它已经被定义为正数,幸运的是不超过一个小时:) 但非常感谢您的帮助!!
  • @LauraMoise:对 - 在这种情况下,我会在方法的开头添加测试以确保它不是负数,并且它isn' t 一个多小时。在这些情况下抛出IllegalArgumentException
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多