【问题标题】:Formatting a *relative* amount of time (ms) in Java?在Java中格式化*相对*时间(毫秒)?
【发布时间】:2011-11-29 14:08:13
【问题描述】:

我想通过它们的相对时间记录某些事件。我不在乎一天中的什么时间发生了什么事,我只想知道一个事件发生在 2 分 13 秒和 243 毫秒前。假设我有:

long event_ms = [some time in ms since the Epoch];
long now_ms = [current time in ms since the Epoch];
long diff_ms = now_ms - event_ms;

diff_ms 包含事件发生前的毫秒数。这次我只想格式化(使用格式 HH:mm:ss.SSS)。最简单的方法是什么?谢谢!

【问题讨论】:

    标签: java


    【解决方案1】:

    TimeUnit 类包含将毫秒转换为小时、分钟和秒的方法:

    String.format("%d min, %d sec", 
        TimeUnit.MILLISECONDS.toMinutes(millis),
        TimeUnit.MILLISECONDS.toSeconds(millis) - 
        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
    );
    

    P.S 请注意,TimeUnit 仅在 1.5+ 中可用

    【讨论】:

    • 啊!我从来不知道 TimeUnit 并编写了自己的方法来做到这一点。不是说难,而是浪费时间……
    【解决方案2】:

    更简单的方法

    String.format("%d min, %d sec, %d ms", 
                  millis/60/1000, millis/1000%60, millis%1000);
    

    【讨论】:

      【解决方案3】:

      您不需要 TimeUnit 来执行简单的整数运算,例如除法和模数,也不需要使用 TimeZone(s),因为您处理的是与时区无关的增量。这是我会使用的解决方案:

      long millis = 123456L;
      String delta = String.format(
        "%02d:%02d:%02d.%03d",
        (millis / (1000L * 60L * 60L)),
        (millis / (1000L * 60L)) % 60,
        (millis / 1000L) % 60,
        millis % 1000L
      );
      

      【讨论】:

        【解决方案4】:

        以下代码对我来说很好用:

            int diff_ms = 61200;
            SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss.SSS");
            fmt.setTimeZone(TimeZone.getTimeZone("GMT"));
            String str = fmt.format(new Date(diff_ms));
            System.out.println(str);
        

        它打印00:01:01.200

        注意设置时区。否则结果取决于您的默认时区,并且除了 GMT 之外的任何地方都会出错。

        【讨论】:

        • 由于 Date 已被弃用,什么是合适的替代品?谢谢!
        • 日期不详。只有它的 setter 和 getter。我没有使用它们。因此,我发布的示例从使用过贬值的 API 中可以清楚地看出。
        • 不应使用 Date 来表示不是瞬间的事物。这不是一个好的解决方案
        • 这里唯一使用 Date 的地方是调用format() 方法,该方法仅适用于这种类型。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 2011-06-20
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多