Java 日期时间为 ISO_DATE_TIME

Java Date Time as ISO_DATE_TIME

我想在 Java 中的 DateTimeFormatter ISO_DATE_TIME 末尾添加一个 Z 未硬编码

String sample = "2018-05-11T13:35:11Z";

DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX][X]");

DateTimeFormatter df1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");

LocalDateTime newLocalDateTime = LocalDateTime.parse(sample, df1);

System.out.println(newLocalDateTime.toString());

输出为:

2018-05-11T13:35:11

我希望输出为 2018-05-11T13:35:11Z

您正在呼叫 LocalDateTimetoString(),您应该呼叫 format。变化

System.out.println(newLocalDateTime.toString());

System.out.println(newLocalDateTime.format(df1));

产出

2018-05-11T13:35:11Z

如果您希望输出具有像 Z 这样的时区偏移量,您应该使用 OffsetDateTimeZonedDateTime

LocalDateTime ldt = LocalDateTime.parse("2018-05-11T13:35:11");

OffsetDateTime odt = ldt.atOffset(ZoneOffset.UTC);
System.out.println(odt); // prints: 2018-05-11T13:35:11Z

ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC);
System.out.println(zdt); // prints: 2018-05-11T13:35:11Z

如您所见,toString() 方法将 return 日期以您请求的格式显示。

你不应该使用 LocalDateTime。使用 OffsetDateTime。你可能不需要格式化程序。

    String sample = "2018-05-11T13:35:11Z";

    OffsetDateTime dateTime = OffsetDateTime.parse(sample)
            .withOffsetSameInstant(ZoneOffset.UTC);

    System.out.println(dateTime.toString());

此代码段的输出是所需的:

2018-05-11T13:35:11Z

调用 withOffsetSameInstant() 可确保日期和时间为 UTC,即使输入的不是 UTC。我正在使用 OffsetDateTime.toString() 来生成输出字符串。我正在利用这样一个事实,即您的示例字符串和所需的输出都是 ISO 8601 格式。 OffsetDateTime 和 java.time 中的另一个 类 将 ISO 8601 格式解析为默认格式,即没有任何显式格式化程序,并从其 toString 方法生成 ISO 8601 格式。

OffsetDateTime.toString() 一方面,如果秒数为 0,则会省略秒数;另一方面,如果秒数不为零,则会包含一小部分秒数(所有这些都与 ISO 8601 相冲突)。如果你不想要这个,你确实需要一个格式化程序。例如:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");
    System.out.println(dateTime.format(formatter));

你是对的,你不应该将 Z 硬编码为格式模式字符串中的文字。 Z 表示与 UTC 的偏移量为零。使用格式模式字母 X 输出偏移量,以确保偏移量始终正确。这将打印零偏移量作为 Z.

A LocalDateTime 不保留 UTC 偏移量,因此当解析为一个时,您会丢失信息。不要这样做。解析为 OffsetDateTime 以从字符串中获取所有信息。

Link: Wikipedia article: ISO 8601