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

这会输出以下内容:

====Event date Time before truncate===

2021-03-09T20:46:24.081Z

====Event date Time after truncate===

2021-03-09T20:46:24Z

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

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

祖鲁时代

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

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

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

LocalDateTime

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

请注意,LocalDateTime 对象本质上是不明确的,并不代表一个时刻。换句话说,调用 LocalDateTime.now 几乎从来都不是正确的做法。但如果你坚持:

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

可以有两种方式:

  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 小时的时区偏移)。

以下table为您提供java.time类型的概览:

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

Trail: Date Time.

了解有关现代日期时间的更多信息 API