Подтвердить что ты не робот

Как сравнить два периода времени Joda

Это не кажется неприглядным.

Я пытаюсь это сделать:

@Override
public int compare(Period o1, Period o2) {
    return o1.toStandardDays().getDays() > o2.toStandardDays().getDays() ? -1 : (o1.toStandardDays().getDays() == o2.toStandardDays().getDays() ? 0 : 1);
}

Но я получаю это исключение:

java.lang.UnsupportedOperationException: Cannot convert to Days as this period contains months and months vary in length
    at org.joda.time.Period.checkYearsAndMonths(Period.java:1455)
    at org.joda.time.Period.toStandardDays(Period.java:1314)

Я надеялся, что Peroid будет иметь метод isLongerThan(Period p).

4b9b3361

Ответ 1

Из Документация Joda:

Чтобы сравнить фактическую продолжительность двух периодов, преобразуйте оба параметра в длительность с помощью toDuration, операцию, которая подчеркивает, что результат может отличаться в зависимости от выбранной даты.

Два метода toDuration: BasePeriod#toDurationTo(ReadableInstant) и BasePeriod#toDurationFrom(ReadableInstant). Это означает, что вы должны выбрать момент начала или окончания этого периода, чтобы иметь возможность вычислить его продолжительность.

Если это проблема для вас, тогда вы можете напрямую использовать Duration вместо Period.

Ответ 2

Я написал метод, который должен иметь возможность сравнить два Периода с ближайшим днем ​​(мне не нужны часы и минуты):

private int comparePeriods(Period period1, Period period2)
{
    if (period1.getYears() != period2.getYears())
    {
        return Integer.compare(period1.getYears(), period2.getYears());
    }
    if (period1.getMonths() != period2.getMonths())
    {
        return Integer.compare(period1.getMonths(), period2.getMonths());
    }
    if (period1.getWeeks() != period2.getWeeks())
    {
        return Integer.compare(period1.getWeeks(), period2.getWeeks());
    }
    if (period1.getDays() != period2.getDays())
    {
        return Integer.compare(period1.getDays(), period2.getDays());
    }
    return 0;
}

Обратите внимание, что этот метод ожидает, что оба периода будут нормализованы или не даст точных результатов.

Ответ 3

Как сказал Мэтт Болл в своем ответе, чтобы сравнить 2 периода, вам нужно сначала преобразовать их в длительность. Продолжительность относится к определенному моменту времени, поэтому вам нужно сделать что-то вроде этого:

public static boolean isLonger(Period p1, Period p2) {
   Instant now = Instant.now();
   Duration d1 = p1.toDurationTo(now);
   Duration d2 = p2.toDurationTo(now);
   return d1.isLongerThan(d2);
}

public static boolean isShorter(Period p1, Period p2) {
   Instant now = Instant.now();
   Duration d1 = p1.toDurationTo(now);
   Duration d2 = p2.toDurationTo(now);
   return d1.isShorterThan(d2);
}