如果我有这段代码:
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专门寻找解决方案,只是用它来解释问题。
答案 0 :(得分:1)
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);
或者,您可以执行您已经在做的事情,但最后,检查s2
或e2
是否在开始/结束间隔之外,并将相应的持续时间添加回结果:
if (s2.isBefore(start)) {
result = result.plus(new Duration(s2, start));
}
if (e2.isAfter(end)) {
result = result.plus(new Duration(end, e2));
}
不确定集合理论是否真的适用于此,但我可能错了(我不是数学专家)。