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
您正在呼叫 LocalDateTime
的 toString()
,您应该呼叫 format
。变化
System.out.println(newLocalDateTime.toString());
至
System.out.println(newLocalDateTime.format(df1));
产出
2018-05-11T13:35:11Z
如果您希望输出具有像 Z
这样的时区偏移量,您应该使用 OffsetDateTime
或 ZonedDateTime
。
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
以从字符串中获取所有信息。
我想在 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
您正在呼叫 LocalDateTime
的 toString()
,您应该呼叫 format
。变化
System.out.println(newLocalDateTime.toString());
至
System.out.println(newLocalDateTime.format(df1));
产出
2018-05-11T13:35:11Z
如果您希望输出具有像 Z
这样的时区偏移量,您应该使用 OffsetDateTime
或 ZonedDateTime
。
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
以从字符串中获取所有信息。