Можно ли отклонить несколько четвертных цифр при разборе YearQuarter с помощью ThreeTen-Extra? - PullRequest
0 голосов
/ 19 сентября 2018

Я использую YearQuarter из библиотеки ThreeTen-Extra для представления определенного квартала в течение данного года.

Я использую пользовательский формат, а неформат по умолчанию, например, «3Q2018» вместо «2018-Q3» для третьего квартала 2018. При анализе значения через YearQuarter.parse (text, formatter) мне нужны значения с ведущими нулями за кварталбыть отклоненным (через стандартное DateTimeParseException ).

Моя первая попытка была использовать DateTimeFormatter.ofPattern("Q'Q'yy").Тем не менее, это принимает строки с произвольным количеством ведущих нулей перед кварталом.Например, этот форматтер не отклоняет ни «02Q2007», ни «002Q2007».

Это похоже на то, как обрабатываются шаблоны с одним символом для других временных типов.Например, они успешно анализируются без ошибок:

YearMonth.parse("012-2018", DateTimeFormatter.ofPattern("M-yyyy"))
LocalTime.parse("001:00:01", DateTimeFormatter.ofPattern("H:mm:ss"))
LocalTime.parse("01:00:012", DateTimeFormatter.ofPattern("HH:mm:s"))

Однако они отклоняют ввод с помощью DateTimeParseException:

YearMonth.parse("012-2018", DateTimeFormatter.ofPattern("MM-yyyy"))
LocalTime.parse("001:00:01", DateTimeFormatter.ofPattern("HH:mm:ss"))
LocalTime.parse("01:00:012", DateTimeFormatter.ofPattern("HH:mm:ss"))

Как я могу создать DateTimeFormatter проанализировать YearQuarter в моем желаемом формате, отклоняя значения с более чем одной цифрой за квартал?В идеале я хотел бы сделать это в виде строки шаблона, поскольку людям легче читать и гораздо легче выводить текстовые свойства.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Если вы настаиваете на использовании строки шаблона, то я боюсь, что в контексте DateTimeFormatter нет пути, но я успешно проверил мою библиотеку Time4J , если она обеспечивает желаемое поведение:

    ChronoFormatter<CalendarQuarter> f =
        ChronoFormatter.ofPattern(
            "Q'Q'uuuu", PatternType.CLDR, Locale.ROOT, CalendarQuarter.chronology());
    CalendarQuarter cq = f.parse("3Q2018");
    System.out.println(cq); // 2018-Q3
    f.parse("13Q2018"); // exception
    f.parse("03Q2018"); // exception

Объект типа CalendarQuarter соответствует YearQuarter, поэтому вы найдете похожие методы для его замены на григорианскую дату, например:

    CalendarQuarter cq = f.parse("3Q2018");
    LocalDate ld = cq.atEndOfQuarter().toTemporalAccessor();
    System.out.println(ld); // 2018-09-30
0 голосов
/ 19 сентября 2018

Я не нашел способа сделать это в виде строки шаблона, но следующие программно создадут DateTimeFormatter с желаемым форматом, отклоняя четверти с добавлением 0:

import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.time.temporal.IsoFields;

[...]

new DateTimeFormatterBuilder()
    .appendValue(IsoFields.QUARTER_OF_YEAR, 1)
    .appendLiteral('Q')
    .appendValue(ChronoField.YEAR, 4)
    .toFormatter();
...