【问题标题】:Perform A - B (A\B) with Time in java?在 java 中使用 Time 执行 A - B (A\B)?
【发布时间】:2018-03-01 19:10:03
【问题描述】:

如果我有这个代码:

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 中寻找解决方案,只是用它来解释问题。

【问题讨论】:

    标签: java time jodatime duration


    【解决方案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);
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-10
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2014-03-29
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多