【问题标题】:Java LocalDateTime remove the milliseconds from UTC timezoneJava LocalDateTime 从 UTC 时区中删除毫秒
【发布时间】:2021-03-09 20:56:43
【问题描述】:

我正在尝试从UTC 时区截断毫秒。

我有下面的代码,我可以在其中删除毫秒,但最后我仍然得到Z

OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC );
OffsetDateTime eventDateTime=now.minus(4, ChronoUnit.MINUTES);

System.out.println("====Event date Time before truncate===");
System.out.println(eventDateTime);
      
System.out.println("====Event date Time after truncate===");
System.out.println(eventDateTime.truncatedTo(ChronoUnit.SECONDS));

这会输出以下内容:

====事件日期时间之前截断===

2021-03-09T20:46:24.081Z

====事件日期 截断后时间===

2021-03-09T20:46:24Z

【问题讨论】:

  • 调用OffsetDateTime.toLocalDateTime()获取不带时区的日期/时间值。
  • Z 只是表示它是 UTC。如果您需要特定的输出格式,请使用 DateTimeFormatter
  • 请提供更多背景信息,您认为为什么要这样做,我相信我们可以为您提供更好的指导。虽然我可以看到用户可能不希望看到秒和 UTC 偏移量的分数,但他们通常希望时间在他们自己的时区而不是 UTC,并且他们更喜欢本地化的日期和时间格式。那是为了什么目的呢?

标签: java truncate localdatetime


【解决方案1】:

Z 是时区信息。您可以像这样将OffsetDateTime 实例转换为LocalDateTime

eventDateTime.truncatedTo(ChronoUnit.SECONDS).toLocalDateTime()

【讨论】:

    【解决方案2】:

    祖鲁时间

    末尾的Z 代表重要信息:日期时间代表与UTC 零小时-分钟-秒的偏移量的时刻。此字母被定义为 ISO 8601 中标准格式的一部分。根据航空/军事传统,该字母发音为“Zulu”。

    如果您不关心问题域中的偏移量或时区,那么您使用了错误的类型。

    InstantOffsetDateTimeZonedDateTime 类型都代表一个时刻,时间轴上的一个特定点。这三个都涉及偏移量或时区。

    LocalDateTime

    如果您只想要一个包含时间但缺少偏移/区域上下文的日期,请使用LocalDateTime。没有Z 将出现在代表LocalDateTime 值的文本中,因为不涉及偏移量。

    请注意,LocalDateTime 对象本质上是模棱两可的,并不代表片刻。换句话说,打电话给LocalDateTime.now 几乎从来都不是正确的做法。但如果你坚持:

    LocalDateTime ldt = LocalDateTime.now( ZoneOffset.UTC ) ;
    

    【讨论】:

      【解决方案3】:

      可以有两种方式:

      1. 首选方式:使用DateTimeFormatter
      2. 使用OffsetDateTime#toLocalDateTime:这种方法的问题是如果秒部分为零,输出字符串会自动截断为分钟。

      演示:

      import java.time.OffsetDateTime;
      import java.time.ZoneOffset;
      import java.time.format.DateTimeFormatter;
      import java.time.temporal.ChronoUnit;
      
      public class Main {
          public static void main(String[] args) {
              DateTimeFormatter dtfWithoutSecFraction = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss");
              DateTimeFormatter dtfWithSecFraction = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
              OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
      
              OffsetDateTime eventDateTime = now.minusMinutes(4);
      
              System.out.println("====Event date Time before truncate===");
              System.out.println(eventDateTime);
              System.out.println(eventDateTime.toLocalDateTime());
              System.out.println(dtfWithSecFraction.format(eventDateTime));
      
              System.out.println("====Event date Time after truncate===");
              System.out.println(eventDateTime.truncatedTo(ChronoUnit.SECONDS));
              System.out.println(eventDateTime.truncatedTo(ChronoUnit.SECONDS).toLocalDateTime());
              System.out.println(dtfWithoutSecFraction.format(eventDateTime.truncatedTo(ChronoUnit.SECONDS)));
          }
      }
      

      输出:

      ====Event date Time before truncate===
      2021-03-09T21:17:17.589016Z
      2021-03-09T21:17:17.589016
      2021-03-09T21:17:17.589016
      ====Event date Time after truncate===
      2021-03-09T21:17:17Z
      2021-03-09T21:17:17
      2021-03-09T21:17:17
      

      请注意,Z 代表 Zulu,它以 UTC 格式指定日期时间(即时区偏移量为 +00:00 小时)。

      下表概述了 java.time 类型:

      如您所见,OffsetDateTimeZonedDateTime 等带有时区信息,您可以使用上述解决方案中提到的技术仅获取日期时间部分。

      Trail: Date Time 了解有关现代日期时间 API 的更多信息。

      【讨论】:

        猜你喜欢
        • 2015-10-21
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        • 2013-07-28
        • 1970-01-01
        • 2014-07-19
        • 1970-01-01
        相关资源
        最近更新 更多