当试图比较两个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));
预计打印
false
false
但它是
true
false
所以当我查看持续时间CTOR时,结果发现它实际上创建了一个持续时间为负毫秒的持续时间(getMils()返回-ve)。
-ve Duration是什么意思? (为了保持客观) 这是一个错误还是一个功能?
答案 0 :(得分:5)
听起来对我来说完全合理。您正在向构造函数传递负数毫秒 - 为什么期望成为正面?
负持续时间只是一个负时间 - 来自&#34;现在&#34;过去的某个时间&#34;,例如。它允许合理的算术:
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
- 或者在你的情况下,根本不要Duration
使用d1
:
long d1 = Math.Abs(dt1.getMillis() - dt2.getMillis());