将字符串转换为分区日期时间



我需要将字符串 2020-04-15T23:00:00+0000 转换为分区日期时间。我尝试了以下方法,但它们不起作用:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss Z");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss 00:00");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss 0000");
System.out.println(ZonedDateTime.parse("2020-04-15T23:00:00+0000", formatter));

我也使用了ISO_LOCAL_DATE_TIME,但这不起作用。有什么想法吗?

更新:

我在下面尝试:

OffsetDateTime dateTime1 = OffsetDateTime.parse("2020-04-15T23:00:00+0000",
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));
System.out.println(dateTime1.toZonedDateTime());

我得到的输出为 2020-04-15T23:00Z,但我需要它作为 2020-04-15T23:00:00Z,最后的秒数正在修剪。

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.appendPattern("XX")
.toFormatter();
String str = "2020-04-15T23:00:00+0000";
OffsetDateTime dateTime = OffsetDateTime.parse(str, formatter);
System.out.println(dateTime);

输出:

2020-04-15T23:00Z

由于您的输入字符串包含偏移量、+0000和没有时区,因此更喜欢将日期和时间表示为OffsetDateTime,而不是ZonedDateTime(如果您有需要ZonedDateTime的特定原因,只需在上面的代码中使用该类,它也可以工作)。

我更喜欢使用内置格式化程序,而不是编写自己的格式模式字符串。仅对于偏移量,我正在使用格式模式XX(还有其他模式也可以)。

我得到的输出为 2020-04-15T23:00Z,但我需要它作为 2020-04-15T23:00:00Z,末尾有秒,这是 修剪。

你很可能不会。格式为 ISO 8601,在 ISO 8601 中,当秒为 0 时,秒是可选的。OffsetDateTimeZonedDateTime具有完全精度(甚至纳秒)。省略(您称之为修整)仅发生在对象的toString方法生成的输出中。如果您需要其他 API 或其他系统的 ISO 8601 格式,则不带秒的变体也应该有效。

如果确实需要特定格式,请使用第二个DateTimeFormatter以该所需格式格式化为字符串。

您的代码中出了什么问题?

Mark Rotteveel已经说过:ISO 8601不允许在时间和UTC偏移量之间留出空间。或者反过来说,当你在格式模式字符串中在ssZ之间放置一个空格时,解析将需要在解析的字符串中有一个空格。由于没有空间,解析失败。

链接

  • 维基百科文章:ISO 8601
  • 相关问题:无法将 ISO 8601 格式的字符串解析为 Java 8 日期,偏移量中缺少冒号

您可以像下面这样转换,它支持以下所有输入格式

"2012-10-01T19:30:00+0200"
"2012-10-01T19:30:00+02" 
"2012-10-01T19:30:00+02:00"
"2012-10-01T19:30:00Z" 

代码段

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

OffsetDateTime osdt1 = OffsetDateTime.parse("2020-04-15T23:00:01+0000", dtf1);
OffsetDateTime osdt2 = OffsetDateTime.parse("2020-04-15T23:00:43+0900", dtf1);
OffsetDateTime osdt3 = OffsetDateTime.parse("2020-04-15T23:00:00+0000", dtf1);
OffsetDateTime osdt4 = OffsetDateTime.parse("2020-04-15T23:00:00+0900", dtf1);
System.out.println("2020-04-15T23:00:01+0000 --> " + osdt1.toString());
System.out.println("2020-04-15T23:00:43+0900 --> " + osdt2.toString());
System.out.println("2020-04-15T23:00:00+0000 --> " + osdt3.toString());
System.out.println("2020-04-15T23:00:00+0900 --> " + osdt4.toString());
System.out.println("n");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
System.out.println("2020-04-15T23:00:01+0000 --> " + dtf2.format(osdt1));
System.out.println("2020-04-15T23:00:43+0900 --> " + dtf2.format(osdt2));
System.out.println("2020-04-15T23:00:00+0000 --> " + dtf2.format(osdt3));
System.out.println("2020-04-15T23:00:00+0900 --> " + dtf2.format(osdt4));

以上件的输出

2020-04-15T23:00:01+0000 --> 2020-04-15T23:00:01Z
2020-04-15T23:00:43+0900 --> 2020-04-15T23:00:43+09:00
2020-04-15T23:00:00+0000 --> 2020-04-15T23:00Z
2020-04-15T23:00:00+0900 --> 2020-04-15T23:00+09:00

2020-04-15T23:00:01+0000 --> 2020-04-15T23:00:01+0000
2020-04-15T23:00:43+0900 --> 2020-04-15T23:00:43+0900
2020-04-15T23:00:00+0000 --> 2020-04-15T23:00:00+0000
2020-04-15T23:00:00+0900 --> 2020-04-15T23:00:00+0900

最新更新