java - 如何使用 java 8 从日期时间间隔中获取析取

标签 java datetime lambda java-8 intervals

我有两个 DateTime 间隔列表,我想获得这些列表的析取。有谁知道怎么计算吗?

每个间隔都保存为一个对象:

public class Interval {
    LocalDateTime start;
    LocalDateTime end;
}

例如我有:

List<Interval> list1 >> [from 10:00 to 12:00] and [from 13:00 to 14:00]
List<Interval> list2 >> [from 10:00 to 11:00] and [from 13:30 to 14:00]

我想要得到的结果是它们不重叠的间隔:

List<Interval> result >> [from 11:00 to 12:00] and [from 13:00 to 13:30]

最佳答案

您可以手动完成所有操作,也可以使用我的库 Time4J并研究这个例子,接受你的输入,产生预期的输出。据我正确理解,您正在寻找 minus-operation ,即从一个间隔列表中减去另一个间隔列表:

// first collect the intervals from "list1" into an IntervalCollection
TimestampInterval i1 =
    TimestampInterval.between(
        LocalDateTime.of(2017, 9, 9, 10, 0),
        LocalDateTime.of(2017, 9, 9, 12, 0));
TimestampInterval i2 =
    TimestampInterval.between(
        LocalDateTime.of(2017, 9, 9, 13, 0),
        LocalDateTime.of(2017, 9, 9, 14, 0));
IntervalCollection<PlainTimestamp> ic =
    IntervalCollection.onTimestampAxis().plus(Arrays.asList(i1, i2));

// then collect the intervals from "list2" as simple interval list
TimestampInterval j1 =
    TimestampInterval.between(
        LocalDateTime.of(2017, 9, 9, 10, 0),
        LocalDateTime.of(2017, 9, 9, 11, 0));
TimestampInterval j2 =
    TimestampInterval.between(
        LocalDateTime.of(2017, 9, 9, 13, 30),
        LocalDateTime.of(2017, 9, 9, 14, 0));

// finally perform the minus-operation
List<ChronoInterval<PlainTimestamp>> result = ic.minus(Arrays.asList(j1, j2)).getIntervals();

System.out.println(result);
// output: [[2017-09-09T11/2017-09-09T12), [2017-09-09T13/2017-09-09T13:30)]

// Alternative to get back `LocalDateTime`-objects for start (inclusive) and end (exclusive):
for (ChronoInterval<PlainTimestamp> interval : result) {
    LocalDateTime start = interval.getStart().getTemporal().toTemporalAccessor();
    LocalDateTime end = interval.getEnd().getTemporal().toTemporalAccessor();
    System.out.println(start + "/" + end);
}

关于java - 如何使用 java 8 从日期时间间隔中获取析取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46122615/

相关文章:

java - 在 ServiceMix/CXF 的上下文中, 'transport' 是什么意思?

java - 如何在android中获取时区偏移量?

java - 从 Joda 时间迁移到 Java 8 DateTime

javascript 计时器和 css 位置更新

java - 需要CallSite解释

variables - 带有捕获变量的 Lambda

java - 为什么我会收到空​​堆栈异常?

java - REGEX 匹配文件名约定

c# - 在 .net Web 服务方法签名中使用 DateTime 或 String

java - 如何在 Java lambda 中映射多个变量?