如何比较两个Joda时间段

时间:2011-06-24 12:41:49

标签: java jodatime

看起来并不简单。

我正在尝试这个:

@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 个答案:

答案 0 :(得分:13)

来自the Joda Documentation

  

要比较两个句点的实际持续时间,请使用toDuration将两者转换为持续时间,这一操作强调结果可能会根据您选择的日期而有所不同。

两种toDuration方法是BasePeriod#toDurationTo(ReadableInstant)BasePeriod#toDurationFrom(ReadableInstant)。这意味着您必须选择此期间的开始或结束时刻才能计算其持续时间。

如果您遇到问题,那么您可能希望直接使用Duration 而不是Period

答案 1 :(得分:1)

我写了一个方法,应该能够比较两个时段到最近的一天(我不关心小时和分钟):

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 :(得分:0)

正如Matt Ball在他的回答中所解释的那样,要比较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);
}