Java ';负数';Joda中的持续时间,bug还是特性?
在尝试比较两个DateTime时,我编写了以下代码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
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());