代码之家  ›  专栏  ›  技术社区  ›  BUKTOP

从字符串分析带有时区的日期

  •  1
  • BUKTOP  · 技术社区  · 6 年前

    我想是个快速的问题。如何解析这样的字符串 "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 临时存取器:offsetseconds=0,ISO解析为2007-07-21类型 java.time.format.parsed(已分析)

    2 回复  |  直到 6 年前
        1
  •  3
  •   Andreas dfa    6 年前

    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
    
        2
  •  3
  •   Joe C    6 年前

    这里的诀窍是从 TemporalAccessor :

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

    从那里,你可以提取 LocalDate 和A ZoneOffset :

    LocalDate date = LocalDate.from(ta);
    ZoneOffset tz = ZoneOffset.from(ta);
    

    然后像这样组合它们:

    ZonedDateTime zdt = date.atStartOfDay(tz);