Через сколько дней продолжительность? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть Duration, как P3M (3 месяца). Как узнать, сколько дней прошло с этого момента?

Все, что у меня сейчас есть, это:

Duration.parseWeekBasedPeriod("P3M")

Я знаю, что параметр period никогда не будет короче 1 недели, поэтому parseWeekBasedPeriod() должно быть хорошо. Но я читаю JavaDo c и не могу понять, как получить эти дни.

Я понимаю, проблема в том, что месяцы могут иметь 31, 30, 29 и 28 дней.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Использование parseWeekBasedPeriod(...), безусловно, неправильно, если вы хотите применять длительности, измеренные в месяцах. Этот особый метод работает с недельными годами, которые могут длиться 364 или 371 день (52 или 53 недели). Поэтому я предлагаю просто использовать стандартный метод синтаксического анализа для календарных длительностей. Следующий код также сильно упрощает оценку дней между двумя датами (см. Последнюю строку).

Duration<CalendarUnit> duration = Duration.parseCalendarPeriod("P3M");
PlainDate today = PlainDate.nowInSystemTime();
PlainDate later = today.plus(duration);
long days = CalendarUnit.DAYS.between(today, later);

Кстати, я еще раз проверил метод на основе продолжительности недели. Обычно он генерирует исключение, если пытается проанализировать месяцы. Похоже, вы не видели никаких исключений, поэтому я предполагаю, что тот факт, что вы используете нетипизированные конструкции, такие как «val», затеняет необходимую информацию о типе при обработке строки продолжительности (а Time4J - библиотека со строгим типом). Поэтому - если это технически возможно для вас - я настоятельно рекомендую использовать код, безопасный для типов, как показано в моем решении.

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

Окончательно разобрался:

val period = Duration.parseWeekBasedPeriod("P3M")
val start = PlainDate.nowInSystemTime()
val end = start.plus(period)
val days: Long = Duration.`in`(CalendarUnit.DAYS).between(start, end).getPartialAmount(CalendarUnit.DAYS)
...