繁体   English   中英

Java LocalDateTime 从 UTC 时区中删除毫秒

[英]Java LocalDateTime remove the milliseconds from UTC timezone

我正在尝试从 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

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

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

祖鲁时间

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

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

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

LocalDateTime

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

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

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

可以有两种方式:

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

演示:

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)));
    }
}

Output:

====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 的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM