【问题标题】:How do I print a millisecond count from epoch as a date-time in UTC using Java?如何使用 Java 从纪元打印毫秒计数作为 UTC 中的日期时间?
【发布时间】:2015-07-02 09:46:46
【问题描述】:

我正在尝试使用 Java 以毫秒为单位将时间格式化为 UTC 日期。我有以下代码:

long ms = 1427590800000;
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.ROOT);
cal.setTimeInMillis(ms);
Date date = cal.getTime();
SimpleDateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd hh:mm:ss");
System.out.println(dateFormat.format(date)); // 2015-03-29 02:00:00

这是在 BST 中打印时间(即使用默认时区)而不是 UTC。日历上设置的时区似乎与打印日期无关。

UTC的实际时间由以下python sn-p显示:

import datetime
ms = 1427590800000
print datetime.datetime.utcfromtimestamp(ms/1000.0) # 2015-03-29 01:00:00

将默认 JVM 时区设置为“UTC”会导致打印正确的日期,但这似乎不是一个安全的解决方案。

【问题讨论】:

标签: java date datetime timezone utc


【解决方案1】:

java.time

现代方法使用行业领先的 java.time 类。

解析为Instant,UTC 时刻,分辨率为纳秒。

long input = 1_427_590_800_000L ;
Instant instant = Instant.ofEpochMilli( input ) ;

ISO 8601

以标准ISO 8601 格式生成字符串。

String output = instant.toString() ;

2015-03-29T01:00:00Z



关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    如果您想要所需的时区,则需要在格式化之前将timezone 设置为格式化程序。

    使用dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));,然后调用dateFormat.format(date)

    【讨论】:

    • 谢谢,这意味着我根本不需要使用Calendar
    猜你喜欢
    • 2020-12-04
    • 2014-12-25
    • 2020-09-14
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2017-02-19
    • 2014-03-14
    相关资源
    最近更新 更多