在Java中用Time执行A-B(A B)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Java中用Time执行A-B(A B)?相关的知识,希望对你有一定的参考价值。

如果我有这个代码:

DateTime start = new DateTime().withTime(4, 0, 0, 0);
DateTime end = start.withTime(5, 0, 0, 0);

DateTime s2 = start.withTime(4,30,0,0);
DateTime e2 = start.withTime(5,30,0,0);

Duration d1 = new Duration(start,end);
Duration d2 = new Duration(s2,e2);

Duration result = d1.minus(d2);
System.out.println((int)result.getStandardMinutes());

有没有办法可以基本上得到A - B或A B(集理论符号)?在这种情况下,结果将是30,因为第一个持续时间有30分钟的时间,在第二个持续时间内不会发生。

我不是专门在Jodatime寻找解决方案,只是用它来解释问题。

答案

Duration表示一段时间(例如“10分30秒”),但它没有附加到时间轴上:10分30秒相对于什么?没有特别的,它只是时间量(值)本身。

特别是在Joda-Time中,在创建Duration之后,对象本身不存储用于计算它的参考日期,因此Duration实例无法知道它是在特定日期之前还是之后(因为它的时间量不是附加到任何特定日期,因此您无法将其与日期进行比较)。

如果要考虑特定日期(在另一个之后或之前),并使用此日期计算持续时间,则必须在计算持续时间之前检查日期:

// ignore dates before the start
DateTime date1 = s2.isBefore(start) ? start : s2;

// ignore dates after the end
DateTime date2 = e2.isAfter(end) ? end : e2;

Duration d2 = new Duration(date1, date2);

或者,您可以执行您已经在做的事情,但最后,检查s2e2是否在开始/结束间隔之外,并将相应的持续时间添加回结果:

if (s2.isBefore(start)) {
    result = result.plus(new Duration(s2, start));
}
if (e2.isAfter(end)) {
    result = result.plus(new Duration(end, e2));
}

不确定集合理论是否真的适用于此,但我可能错了(我不是数学专家)。

以上是关于在Java中用Time执行A-B(A B)?的主要内容,如果未能解决你的问题,请参考以下文章

if (a - b < 0) 和 if (a < b) 之间的区别

代码块:在Java中用{}括起来的代码

Java语言基础---两变量间的交换

Java取余和取模(%和Math.floorMod())的区别

Crontab NTP Sendmail

java多线程中用到的方法详细解析