Шаблон DateTimeFormatter с постфиксом числового литерала работает, только если в шаблоне присутствует пробел - PullRequest
2 голосов
/ 24 сентября 2019

Я видел некоторые похожие проблемы, и эти ошибки уже были исправлены в отношении подобных проблем.Теперь мне интересно, делаю ли я что-то не так, или этот случай до сих пор не раскрыт.Моя проблема в том, что я должен проанализировать дату, за которой следуют нули, поэтому шаблон будет yyyyMMdd'0000 '.Однако это не удается, но если я вставлю пробел в это работает: yyyy MMdd'0000 '

    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyy MMdd'0000'").toFormatter().withResolverStyle(ResolverStyle.STRICT);
    System.out.println(formatter.parse(formatter.format(ZonedDateTime.now())));
    formatter = new DateTimeFormatterBuilder().appendPattern("yyyyMMdd'0000'").toFormatter().withResolverStyle(ResolverStyle.STRICT);
    System.out.println(formatter.parse(formatter.format(ZonedDateTime.now())));

Я знаю, что я мог бы заменить буквальную часть с шаблонами часов и минут, и это будет работать, ноЯ хотел бы использовать его в качестве механизма проверки на входе, поэтому он не должен работать на других значениях, без дополнительного кодирования.Я попробовал это с Oracle JDK 1.8.0_221 и OpenJDK 13 + 33

Спасибо!

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

Ты почти понял.Просто сделай MMMM.

formatter = new DateTimeFormatterBuilder()
        .appendPattern("yyyyMMMMdd'0000'")
        .toFormatter()
        .withResolverStyle(ResolverStyle.STRICT);
1 голос
/ 24 сентября 2019

выглядит не очень аккуратно, но отлично работает как для разбора, так и для рендеринга:

DateTimeFormatter df = new DateTimeFormatterBuilder()
    .appendValue(YEAR, 4)
    .appendPattern("MMdd'0000'")
    .toFormatter()
    .withChronology(IsoChronology.INSTANCE)
    .withResolverStyle(ResolverStyle.STRICT);

log.info(LocalDate.parse("201909260000", df).toString());  // 2019-09-26
log.info(df.format(LocalDate.of(2019, 9, 26)));            // 201909260000
...