快速(我想)问题。如何将像这样的字符串从"2018-07-22 +3:00"
解析为OffsetDateTime
(将时间设置为0:0:0.0
)?
DateTimeFormatter formatter =cDateTimeFormatter.ofPattern("yyyy-MM-dd xxx");
OffsetDateTime dt = OffsetDateTime.parse("2007-07-21 +00:00", formatter);
java.time.format.DateTimeParseException:文本'2007-07-21 +00:00' 无法解析:无法从获取OffsetDateTime TemporalAccessor:{OffsetSeconds = 0},ISO解析为类型的2007-07-21 java.time.format.Parsed
答案 0 :(得分:3)
这里的诀窍是首先获得TemporalAccessor
:
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyy-MM-dd XXX").parse("2018-07-22 +03:00");
从那里,您可以提取LocalDate
和ZoneOffset
:
LocalDate date = LocalDate.from(ta);
ZoneOffset tz = ZoneOffset.from(ta);
并像这样组合它们:
ZonedDateTime zdt = date.atStartOfDay(tz);
答案 1 :(得分:3)
OffsetDateTime
需要一个时间,但是您的格式字符串不提供该时间,因此您需要告诉DateTimeFormatter
将默认时间设置为午夜。
此外,偏移量+3:00
无效,因为小时必须为2位数,这意味着您需要先进行修正。
这将同时执行以下操作:
public static OffsetDateTime parse(String text) {
// Fix 1-digit offset hour
String s = text.replaceFirst("( [+-])(\\d:\\d\\d)$", "$10$2");
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("uuuu-MM-dd xxx")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.toFormatter();
return OffsetDateTime.parse(s, formatter);
}
测试
System.out.println(parse("2018-07-22 +3:00"));
System.out.println(parse("2018-07-22 +03:00"));
System.out.println(parse("2007-07-21 +00:00"));
输出
2018-07-22T00:00+03:00
2018-07-22T00:00+03:00
2007-07-21T00:00Z