Java 时间周期的数学集合?

Java 时间周期的数学集合?,java,time,intervals,Java,Time,Intervals,我正在寻找一种用Java表示一组独立时间段的方法,这些时间段将支持操作(并集、交集等) 请注意,我希望这些操作的结果集将合并到连续的时间段中(尽可能多) 示例: 假设我有两个假设集: // imaginary constructor. numbers are unix times TimeSet a = [(0,2), (3,6)]; TimeSet b = [(1,4), (5,7)]; 现在让我们对它们执行一些操作: a.union(b); // result = [(0,7)]

我正在寻找一种用Java表示一组独立时间段的方法,这些时间段将支持操作(并集、交集等)

请注意,我希望这些操作的结果集将合并到连续的时间段中(尽可能多)

示例:

假设我有两个假设集:

// imaginary constructor. numbers are unix times
TimeSet a = [(0,2), (3,6)]; 
TimeSet b = [(1,4), (5,7)];
现在让我们对它们执行一些操作:

a.union(b);     // result = [(0,7)]
a.minus(b);     // result = [(0,1), (4,5)]
b.minus(a);     // result = [(2,3), (6,7)]
a.intersect(b); // result = [(1,2), (3,4), (5,6)]
a.diff(b);      // result = [(0,1), (2,3), (4,5), (6,7)]

我发现最好的是JodaTime的能力


间隔允许使用“abuts”、“gap”和“overlap”等方法,这可能需要额外的条件算术。

由于Java中缺乏对此类间隔功能的一般支持,我决定用我的库实现它:

力矩d0=力矩of(0,TimeScale.POSIX);
时刻d1=时刻of(1,时间刻度POSIX);
时刻d2=时刻of(2,时间刻度POSIX);
时刻d3=时刻of(3,时间刻度POSIX);
时刻d4=时刻of(4,时间刻度POSIX);
力矩d5=力矩of(5,时间刻度POSIX);
力矩d6=力矩of(6,时间刻度POSIX);
力矩d7=力矩of(7,时间刻度POSIX);
动量间隔i1=介于(d0,d2)之间的动量间隔;
动量间隔i2=介于(d3,d6)之间的动量间隔;
IntervalCollection a=IntervalCollection.onMomentAxis().plus(i1.plus)(i2);
动量间隔i3=介于(d1,d4)之间的动量间隔;
动量间隔i4=介于(d5,d7)之间的动量间隔;
IntervalCollection b=IntervalCollection.onMomentAxis().plus(i3.plus)(i4);
系统输出println(a.plus(b));
//{[1970-01-01T00:00:00Z/1970-01-01T00:00:02Z],[1970-01-01T00:00:01Z/1970-01-01T00:00:04Z],[1970-01-01T00:00:03Z/1970-01-01T00:00:06Z],[1970-01-01T00:00:05Z/1970-01-01T00:00:07Z]
系统输出打印ln(a.union(b));
//{[1970-01-01T00:00:00Z/1970-01-01T00:00:07Z}
系统输出打印ln(a减去(b));
//{[1970-01-01T00:00:00Z/1970-01-01T00:00:01Z),[1970-01-01T00:00:04Z/1970-01-01T00:00:05Z]
系统输出println(b减去(a));
//{[1970-01-01T00:00:02Z/1970-01-01T00:00:03Z],[1970-01-01T00:00:06Z/1970-01-01T00:00:07Z]
系统输出println(a.intersect(b));
//{[1970-01-01T00:00:01Z/1970-01-01T00:00:02Z],[1970-01-01T00:00:03Z/1970-01-01T00:00:04Z],[1970-01-01T00:00:05Z/1970-01-01T00:00:06Z)}
System.out.println(a.xor(b));//您的diff运算符
//{[1970-01-01T00:00:00Z/1970-01-01T00:00:01Z],[1970-01-01T00:00:02Z/1970-01-01T00:00:03Z],[1970-01-01T00:00:04Z/1970-01-01T00:00:05Z],[1970-01-01T00:00:06Z/1970-01-01T00:00:07Z]

为什么
[(0,2),(3,6)]
[(1,4),(5,7)]
的联合会导致
[(0,7)]
而不是
[(0,2),(3,6),(1,4),(5,7)]
?因为我还希望(任何操作的)结果会被合并到连续的时间段中(尽可能)@errr您可能应该将其添加到问题中,因为这与set完全不同。问得好。实际上没有java库提供这些功能,也没有JodaTime或JSR-310。我不希望这些库在将来的任何时候实现这一点。无论如何,对于我的库,我肯定会在l中实现它今年还是发布了。是的,似乎是这样。我最终自己实现了它(不太担心性能和线程安全)。谢谢,但这还不够。它只处理连续的时间段,只支持我提到的少量操作。
Moment d0 = Moment.of(0, TimeScale.POSIX);
Moment d1 = Moment.of(1, TimeScale.POSIX);
Moment d2 = Moment.of(2, TimeScale.POSIX);
Moment d3 = Moment.of(3, TimeScale.POSIX);
Moment d4 = Moment.of(4, TimeScale.POSIX);
Moment d5 = Moment.of(5, TimeScale.POSIX);
Moment d6 = Moment.of(6, TimeScale.POSIX);
Moment d7 = Moment.of(7, TimeScale.POSIX);

MomentInterval i1 = MomentInterval.between(d0,  d2);
MomentInterval i2 = MomentInterval.between(d3,  d6);
IntervalCollection<Moment> a = IntervalCollection.onMomentAxis().plus(i1).plus(i2);

MomentInterval i3 = MomentInterval.between(d1,  d4);
MomentInterval i4 = MomentInterval.between(d5,  d7);
IntervalCollection<Moment> b = IntervalCollection.onMomentAxis().plus(i3).plus(i4);

System.out.println(a.plus(b));
// {[1970-01-01T00:00:00Z/1970-01-01T00:00:02Z),[1970-01-01T00:00:01Z/1970-01-01T00:00:04Z),[1970-01-01T00:00:03Z/1970-01-01T00:00:06Z),[1970-01-01T00:00:05Z/1970-01-01T00:00:07Z)}

System.out.println(a.union(b));
// {[1970-01-01T00:00:00Z/1970-01-01T00:00:07Z)}

System.out.println(a.minus(b));
// {[1970-01-01T00:00:00Z/1970-01-01T00:00:01Z),[1970-01-01T00:00:04Z/1970-01-01T00:00:05Z)}

System.out.println(b.minus(a));
// {[1970-01-01T00:00:02Z/1970-01-01T00:00:03Z),[1970-01-01T00:00:06Z/1970-01-01T00:00:07Z)}

System.out.println(a.intersect(b)); 
// {[1970-01-01T00:00:01Z/1970-01-01T00:00:02Z),[1970-01-01T00:00:03Z/1970-01-01T00:00:04Z),[1970-01-01T00:00:05Z/1970-01-01T00:00:06Z)}

System.out.println(a.xor(b)); // your diff operator
// {[1970-01-01T00:00:00Z/1970-01-01T00:00:01Z),[1970-01-01T00:00:02Z/1970-01-01T00:00:03Z),[1970-01-01T00:00:04Z/1970-01-01T00:00:05Z),[1970-01-01T00:00:06Z/1970-01-01T00:00:07Z)}