从字符串中解析带时区的日期

时间:2018-07-15 16:41:33

标签: java date java-time datetimeoffset

快速(我想)问题。如何将像这样的字符串从"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

2 个答案:

答案 0 :(得分:3)

这里的诀窍是首先获得TemporalAccessor

TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyy-MM-dd XXX").parse("2018-07-22 +03:00");

从那里,您可以提取LocalDateZoneOffset

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