快(我想)提问吧。如何将像"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‘无法解析:无法从TemporalAccessor获得OffsetDateTime:{OffsetSeconds=0},OffsetDateTime解析为java.time.format.Parsed类型的2007-07-21
发布于 2018-07-15 16:59:56
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发布于 2018-07-15 16:53:19
这里的诀窍是从获取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);https://stackoverflow.com/questions/51350231
复制相似问题