【问题标题】:toInstant() in Calendar is showing in GMT instead of Local time日历中的 toInstant() 显示为 GMT 而不是当地时间
【发布时间】:2015-10-30 11:59:18
【问题描述】:

我正在尝试将日历实例转换为即时,我正在这样做

    Calendar cal = new GregorianCalendar();
    System.out.println(cal.getTime());
    Instant inst = cal.toInstant();
    System.out.println(inst.toString());

而且,它的输出如下

2015 年 10 月 30 日星期五 17:23:40 IST

2015-10-30T11:53:40.037Z

所以,我的问题是关于日历和即时输出的差异。瞬间的输出是格林威治标准时间而不是本地时间。 我没有看到任何文档说 Instant 类只给出 GMT 的日期。所以,我不确定为什么会这样。

【问题讨论】:

    标签: java date datetime calendar


    【解决方案1】:

    在 Instant 上调用 toString 会产生如下输出:

    2013-05-30T23:38:23.085Z

    此格式遵循 ISO-8601 标准来表示日期和 时间。

    看看:

    【讨论】:

      【解决方案2】:

      Rawat 的answer 是正确的。根据定义,Instant 始终采用 UTC。

      toString 方法生成的字符串表示的格式是标准的,由 ISO 8601 定义。

      Instant 类是 Java 8 及更高版本中内置的 java.time 框架的一部分。这个框架中的新类取代了 Java 早期的旧 java.util.Date/.Calendar 类。

      避免使用旧课程,因为它们出了名的麻烦。不要混淆新旧。 toInstant 等转换方法仅适用于尚未针对新类型更新旧代码互操作时使用。

      要将Instant 调整为时区,请通过ZoneId 对象指定时区以生成ZonedDateTime

      ZoneId zoneId = ZoneId.of( "America/Montreal" );
      ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
      

      不要被LocalDateTime 类中的“本地”所迷惑。该类代表了日期时间的模糊概念。它适用于任何特定时区,因此与时间线无关。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 2020-09-10
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多