【问题标题】:How can I get the current date and time in UTC or GMT in Java?如何在 Java 中获取 UTC 或 GMT 的当前日期和时间?
【发布时间】:2010-09-23 10:44:51
【问题描述】:

当我创建一个新的Date 对象时,它被初始化为当前时间,但在本地时区。如何获取 GMT 的当前日期和时间?

【问题讨论】:

  • 我知道这些类型的话题已经被完全讨论过了,但我发现 commons-lang 包确实很好地处理了这些常见的 java 问题。 commons.apache.org/lang/api-2.5/org/apache/commons/lang/time查看他们拥有的各种包。
  • 您想要哪个当地时间,以及要达到什么精度。大多数时区是相对于 UTC 定义的,具有以SI 秒为单位测量的固定偏移量,但基于太阳观测和(略微)可变长度秒的 GMT 的关系更为复杂。两者相差最多 0.9 秒。
  • A Date 不包含时区,因此“但在本地时区”是不正确的(或充其量是不准确的)。请参阅 All about java.util.Date

标签: java date localization timezone gmt


【解决方案1】:

UTC 的当前日期

Instant.now().toString().replaceAll("T.*", "");

【讨论】:

    【解决方案2】:

    当我需要输出一个日期对象时,我就是这样做的,这通常是当你需要在 SQL 数据库中保存一个日期并且我希望它是 UTC 时的情况.我只是减去当地时区的偏移时间。

        ZonedDateTime now = ZonedDateTime.now();
        Date nowUTC = new Date(1000 * (now.toEpochSecond() - now.getOffset().getTotalSeconds()));
    

    --更新 Basil 建议以更清洁的方式获得相同的结果是

        Date nowUTC = Date.from(ZonedDateTime.now().toInstant());
    

    但是在非 UTC java 系统环境中对此进行测试后,我发现结果不一样。使用 Basil 的代码,日期仍然在本地区域

    【讨论】:

    • 您将可怕的遗留类 Date 与它的替代品混合在一起,即 JSR 310 中定义的现代 java.time 类。没有必要使用任何 @987654324 @ 或 java.sql.Date 再次上课。该功能完全被 java.time 类(特别是Instant,而不是ZonedDateTime)取代。 Instant.now()
    • 此外,如果你真的想要一个java.util.Date 对象,与尚未更新到java.time的旧代码互操作,只需调用添加的方便转换方法到老班java.util.Date d = Date.fromInstant( myInstant );。如果你有一个ZonedDateTime,你可以提取一个Instantjava.util.Date.from( myZonedDateTime.toInstant() )。不需要在这个答案中看到的计算。
    猜你喜欢
    • 2018-01-08
    • 2020-12-19
    • 2019-07-28
    • 2016-06-15
    • 2010-11-21
    • 2011-05-01
    • 2015-04-20
    • 2021-09-26
    • 2012-10-07
    相关资源
    最近更新 更多