Java ';负数';Joda中的持续时间,bug还是特性?

Java ';负数';Joda中的持续时间,bug还是特性?,java,datetime,jodatime,Java,Datetime,Jodatime,在尝试比较两个DateTime时,我编写了以下代码 private boolean compareTime(DateTime dt1, DateTime dt2) { long d1 = (new Duration(dt1.getMillis() - dt2.getMillis())).getMillis(); long d2 = Duration.standardHours(1).getMillis(); return d1 < d2; } DateT

在尝试比较两个DateTime时,我编写了以下代码

private boolean compareTime(DateTime dt1, DateTime dt2) 
{ 
    long d1 = (new Duration(dt1.getMillis() - dt2.getMillis())).getMillis();
    long d2 = Duration.standardHours(1).getMillis(); 
    return  d1  < d2; 
}
DateTime dt1 = new DateTime();
Thread.sleep(250);
DateTime dt2 = dt1.plusHours(2);
System.out.println(compareTime(dt1,dt2));
System.out.println(compareTime(dt2,dt1));
但确实如此

true
false
所以,当我查看Duration CTOR时,它实际上创建了一个持续时间为负毫秒的持续时间(getMils()返回-ve)

-ve持续时间的含义是什么? (保持非常客观)
这是一个bug还是一个特性

听起来对我来说完全合理。您正在向构造函数传递一个负毫秒数-为什么希望它变成正毫秒数

负持续时间只是一个负的时间量,例如从“现在”到“过去的某个时间”。它允许合理的算法:

Instant x = ...;
Instant y = ...;
// Duration from x to y, although the result isn't "anchored" (it forgets x and y)
Duration d = new Duration(x, y);
Instant y2 = x.plus(d); // y2 is now equal to y
如果没有负的持续时间,这是不可能的

如果您总是想要一个非负的持续时间,只需调用
Math.abs
——或者在您的情况下,对于
d1
,根本不要使用
duration

long d1 = Math.Abs(dt1.getMillis() - dt2.getMillis());

根据文档,正是“间隔”具有开始瞬间和结束瞬间。对于“持续时间”,没有开始瞬间。你可以追溯到时间,但我想时间仍然是正的。@Ajeet:是的,
间隔
知道所涉及的两个瞬间,但持续时间是从(“现在”到“过去的某个时间”)的时间量。换句话说,从interval.start到interval.end的持续时间是这样的,将其添加到interval.start可以得到interval.end。
long d1 = Math.Abs(dt1.getMillis() - dt2.getMillis());