Период недель, который нужно объединить неделями, а не только днями - PullRequest
1 голос
/ 06 апреля 2020
var period = Period.ofWeeks(2)
println("period of two weeks: $period")

дает

period of two weeks: P14D

К сожалению, для моей цели мне нужно P2W в качестве вывода, поэтому непосредственно недели вместо недель преобразуются в дни. Есть ли какой-нибудь элегантный способ сделать это, кроме создания моей строки Period вручную?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Ваше наблюдение верно. java.time.Period на самом деле не сохраняет значение недели, но автоматически преобразует его в дни - уже в заводском методе во время построения. Причина в том, что Period имеет только дни и месяцы / годы в качестве внутреннего состояния.

Возможные обходные пути или альтернативы в порядке увеличения сложности и количества функций:

  • Вы пишете свой собственный класс, реализующий интерфейс java.time.temporal.TemporalAmount с неделями в качестве внутреннего состояния.

  • Вы используете небольшую библиотеку threeten-extra который предлагает класс недель . Но учтите странный стиль печати отрицательной длительности, такой как P-2W вместо -P2W. Пример:

    Weeks w1 = Weeks.of(2);
    Weeks w2 = Weeks.parse("P2W");
    System.out.println(w1.toString()); // P2W
    System.out.println(w2.toString()); // P2W
  • Или вы используете мою библиотеку Time4J , которая предлагает класс net .time4j.Duration . Этот класс не реализует интерфейс TemporalAmount, но предлагает метод преобразования с именем toTemporalAmount(). Также предлагаются различные функции нормализации и форматирования (ISO, через шаблоны и через net.time4j.PrettyTime) и возможности синтаксического анализа (ISO и через шаблоны). Пример:
    Duration<CalendarUnit> d1 = Duration.of(2, CalendarUnit.WEEKS);
    Duration<IsoDateUnit> d2 = Duration.parseWeekBasedPeriod("P2W"); // also for week-based-years
    System.out.println(d1.toString()); // P2W
    System.out.println(PrettyTime.of(Locale.US).print(d2); // 2 weeks

В качестве дополнительной опции та же библиотека также предлагает класс net.time4j.range.Weeks в качестве упрощенного однодневного обучения.

0 голосов
/ 06 апреля 2020

Метод Period toString обрабатывает только день, месяц и год.

, как вы можете видеть ниже, это toString() метод из class java.time.Period.

Так что, к сожалению, я думаю, вам нужно создать это сам.

 /**
     * Outputs this period as a {@code String}, such as {@code P6Y3M1D}.
     * <p>
     * The output will be in the ISO-8601 period format.
     * A zero period will be represented as zero days, 'P0D'.
     *
     * @return a string representation of this period, not null
     */
    @Override
    public String toString() {
        if (this == ZERO) {
            return "P0D";
        } else {
            StringBuilder buf = new StringBuilder();
            buf.append('P');
            if (years != 0) {
                buf.append(years).append('Y');
            }
            if (months != 0) {
                buf.append(months).append('M');
            }
            if (days != 0) {
                buf.append(days).append('D');
            }
            return buf.toString();
        }
    }
...