将字符串转换为 ZonedDateTime
Convert a string to ZonedDateTime
我需要将字符串 2020-04-15T23:00:00+0000 转换为 ZonedDateTime。我尝试了以下但它们没有用:
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,最后的秒数正在修剪。
您可以像下面这样转换,它支持以下所有输入格式
"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
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
的具体原因,只需在上面的代码中使用 class,它也可以工作。
我更喜欢使用内置的格式化程序,而不是编写自己的格式模式字符串。仅针对偏移量,我使用格式模式 XX
(还有其他模式也适用)。
I get output as 2020-04-15T23:00Z but I need it as
2020-04-15T23:00:00Z with the seconds at the end which this is
trimming.
你很可能不知道。格式为 ISO 8601,在 ISO 8601 中,当秒数为 0 时,秒数是可选的。OffsetDateTime
或 ZonedDateTime
具有完全精度(纳秒,甚至)。遗漏(你所谓的修剪)只发生在对象的 toString
方法产生的输出中。如果您需要其他一些 API 或其他系统的 ISO 8601 格式,没有秒的变体也应该有效。
如果您确实需要特定格式,请使用第二个 DateTimeFormatter
将其格式化为所需格式的字符串。
你的代码出了什么问题?
Mark Rotteveel 已经说过:ISO 8601 不允许时间和 UTC 偏移量之间存在 space。或者换句话说,当在你的格式模式字符串中你在 ss
和 Z
之间放置一个 space 时,解析将需要在解析的字符串中有一个 space。由于没有space,解析失败
链接
我需要将字符串 2020-04-15T23:00:00+0000 转换为 ZonedDateTime。我尝试了以下但它们没有用:
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,最后的秒数正在修剪。
您可以像下面这样转换,它支持以下所有输入格式
"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
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
的具体原因,只需在上面的代码中使用 class,它也可以工作。
我更喜欢使用内置的格式化程序,而不是编写自己的格式模式字符串。仅针对偏移量,我使用格式模式 XX
(还有其他模式也适用)。
I get output as 2020-04-15T23:00Z but I need it as 2020-04-15T23:00:00Z with the seconds at the end which this is trimming.
你很可能不知道。格式为 ISO 8601,在 ISO 8601 中,当秒数为 0 时,秒数是可选的。OffsetDateTime
或 ZonedDateTime
具有完全精度(纳秒,甚至)。遗漏(你所谓的修剪)只发生在对象的 toString
方法产生的输出中。如果您需要其他一些 API 或其他系统的 ISO 8601 格式,没有秒的变体也应该有效。
如果您确实需要特定格式,请使用第二个 DateTimeFormatter
将其格式化为所需格式的字符串。
你的代码出了什么问题?
Mark Rotteveel 已经说过:ISO 8601 不允许时间和 UTC 偏移量之间存在 space。或者换句话说,当在你的格式模式字符串中你在 ss
和 Z
之间放置一个 space 时,解析将需要在解析的字符串中有一个 space。由于没有space,解析失败