看起来并不简单。
我正在尝试这个:
@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)
方法。
答案 0 :(得分:13)
要比较两个句点的实际持续时间,请使用
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);
}