【问题标题】:'negative' Duration in Joda, a bug or a feature?Joda中的“负面”持续时间,错误还是功能?
【发布时间】:2016-04-10 07:35:41
【问题描述】:

当尝试比较两个 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

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

-ve 持续时间是什么意思? (保持非常客观) 这是错误还是功能?

【问题讨论】:

    标签: java datetime jodatime


    【解决方案1】:

    对我来说听起来完全明智。您将负数的毫秒数传递给构造函数 - 为什么您期望会变成正数?

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

    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 知道所涉及的两个瞬间 - 但持续时间是从(“现在”到“过去某个时间”的 时间量 ”)。换句话说,从 interval.start 到 interval.end 的持续时间是这样的,将它添加到 interval.start 会给你 interval.end。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2011-06-26
    相关资源
    最近更新 更多