Java - 在 Netbeans IDE 中将毫秒转换为 `HH:mm:ss:SSS` 时结果不正确

标签 java netbeans simpledateformat epoch time-format

我正在尝试将 5007 转换为 HH:mm:ss:SSS,我使用的是 Netbeans IDE v8.2:

Date date = new Date(5007);
DateFormat formatter = new SimpleDateFormat("HH:mm:ss:SSS");
String dateFormatted = formatter.format(date);

但这给了我一个不正确的结果:

01:00:05:007
^^-------------------------why does it print to me 01 in the hours?

但它应该得到:

00:00:05:007
^^-------------------------correct result
<小时/>

Netbeans IDE

当我使用ideone时例如它给了我一个正确的结果:

ideone

关于这个问题有什么解释吗?

我使用两个版本进行测试:Java 7 和 Java 8。

最佳答案

当您要求解释您的问题时,我会诚实地告诉您:您正在滥用 SimpleDateFormat 来格式化持续时间。它从来就不是用于此用途的,并且如果您无论如何尝试的话,也不会为您提供预期的结果。您遇到的问题并不是您将遇到的唯一问题。如果您的持续时间增长到超过 24 小时,则不会对所有日期进行格式化,因此您的结果将以不同的方式出现错误。

除此之外,现在我建议根本不要使用 SimpleDateFormat 类。它的替代品是 java.time.format.DateTimeFormatter,它于 2014 年推出,带来的负面影响要少得多。不过,对于格式化持续时间来说,这也不是一个好的选择。

那么什么是好的选择呢?我首先给你 Java 9 的答案,因为它很简单:

        Duration dur = Duration.ofMillis(5007);
        String hmss = String.format("%02d:%02d:%02d:%03d", 
                                    dur.toHours(),
                                    dur.toMinutesPart(), 
                                    dur.toSecondsPart(), 
                                    dur.toMillisPart​());

主要优点甚至不是简单,而是清晰。例如,使用这段代码,没有人需要问我在评论中提出的问题,这是一个时间点还是一个持续时间?代码非常清楚地表明它是一个持续时间。

对于 Java 6、7 和 8,您仍然可以使用 Duration 类(在 Java 6 和 7 中通过 ThreeTen Backport ),但它不太容易格式化,所以我想我会求助于使用 TimeUnit 枚举,如 the question I had linked to 中所示(您要求我再次删除的链接):

    long millis = 5007;
    long hours = TimeUnit.MILLISECONDS.toHours(millis);
    millis -= TimeUnit.HOURS.toMillis(hours);
    long minutes = TimeUnit.MILLISECONDS.toMinutes(millis);
    millis -= TimeUnit.MINUTES.toMillis(minutes);
    long seconds = TimeUnit.MILLISECONDS.toSeconds(millis);
    millis -= TimeUnit.SECONDS.toMillis(seconds);
    String hmss = String.format("%02d:%02d:%02d:%03d", hours, minutes, seconds, millis);

结果是想要的

00:00:05:007

为了说明我试图说明持续时间超过 24 小时时会发生什么情况,让我们尝试给它 100 000 000 毫秒(一天有 86 400 000 毫秒):

27:46:40:000

关于Java - 在 Netbeans IDE 中将毫秒转换为 `HH:mm:ss:SSS` 时结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44517518/

相关文章:

java - Hibernate 传递集合映射

php - NetBeans 总是显示警告 : "The authenticity of host x can' t be established"after upload, 下载或同步

java - 为什么 SimpleDateFormat ("MM/dd/yyyy")将日期解析为 10/20/20128?

Android 中使用 DateFormat 的 java.lang.IllegalArgumentException

java - 如何使用 SimpleDateformat 格式化公历日期

java - 如何链接多个并发 rx-java Single

java - 使用 Jackson 映射 Json 时出现问题

java - 从具有文档/文字格式的 WSDL 生成 Web 服务

java - 如何使切换按钮自动切换

java - 如何在 Java 桌面应用程序中显示每分钟左右重新加载一次的内容?