Как сравнить два периода времени 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) метод.

3 ответов


С документация Joda:

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

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

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


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

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;
}

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


как Мэтт Болл также объяснил в своем ответе, чтобы сравнить 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);
}