0

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

4

3 回答 3

3

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

eventDateTime.truncatedTo(ChronoUnit.SECONDS).toLocalDateTime()
于 2021-03-09T21:03:00.820 回答
3

祖鲁时间

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

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

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

LocalDateTime

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

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

LocalDateTime ldt = LocalDateTime.now( ZoneOffset.UTC ) ;
于 2021-03-09T21:08:02.147 回答
2

可以有两种方式:

  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代表Zuluwhich 指定 UTC 中的日期时间(即时区偏移+00:00小时数)。

下表概述了java.time类型:

在此处输入图像描述

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

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

于 2021-03-09T21:09:19.933 回答