Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较两个Joda时间段_Java_Jodatime - Fatal编程技术网

Java 如何比较两个Joda时间段

Java 如何比较两个Joda时间段,java,jodatime,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.Uns

这似乎并不过分

我正在尝试:

@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) java.lang.UnsupportedOperationException:无法转换为天,因为此期间包含月,且月的长度不同 在org.joda.time.Period.checkYearsAndMonths上(Period.java:1455) 位于org.joda.time.Period.toStandardDays(Period.java:1314) 我希望
Peroid
会有一个
isLongerThan(p段)
方法。

来自:

要比较两个时段的实际持续时间,请使用
toDuration
将两个时段转换为持续时间,该操作强调结果可能因您选择的日期而异

两种
toDuration
方法是和。这意味着您必须选择此时段的开始或结束时刻,以便能够计算其持续时间


如果这对您来说是个问题,您可能希望直接使用而不是
句点

我写了一个方法,应该能够将两个句点与最近的一天进行比较(我不关心小时和分钟):


请注意,该方法要求两个周期均正常化,否则无法给出准确的结果。

正如马特·鲍尔在其回答中所解释的,要比较两个周期,需要先将它们转换为持续时间。持续时间是相对于某个时间点的,因此您需要执行以下操作:

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

“1个月30天”比“2个月”长还是短?@raticulin:而“未定义”正是你得到的。它表示为一个例外情况。@Joachim“未定义”是指您不知道自己得到的是“1个月,30天”还是“2个月”。例外情况并非如此。@raticulin这显然不是他们对
未定义的定义,也不是我的定义。当软件说“在这样或那样的条件下,行为是未定义的”时,你真的不能期待任何事情
undefined
可能意味着计算返回意外值,或引发异常,或导致您的计算机死机。@matt不是“定义”或“您的定义”?@Benj感谢您的编辑,但该术语广泛用于指代文档生成器系统和/或其输出。许多项目和库提供指向JavaDoc页面的链接,这些页面是通过运行JavaDoc工具生成的。我不认为大多数人会对“JavaDoc”是否指JavaSE的API文档感到困惑或不清楚。也许是因为我是法国人?在这里,很多人使用(英语)“JavaDoc”来指代Oracle(以前的Sun)在线文档或书籍,然后是图书馆API。我至少学到了一些东西,我会在乎的;)+1.
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);
}