使用我的时间库Time4J,可以使用以下方便的解决方案,而无需对实际实现进行太多头脑风暴:
// create the intervals
SimpleInterval<Date> i1 = SimpleInterval.between(new Date(0L), new Date(5000L));
SimpleInterval<Date> i2 = SimpleInterval.between(new Date(0L), new Date(7000L));
SimpleInterval<Date> i3 = SimpleInterval.between(new Date(1000L), new Date(2000L));
// collect the intervals
IntervalCollection<Date> icoll =
IntervalCollection.onTraditionalTimeLine().plus(i3).plus(i2).plus(i1);
// split and iterate
for (ChronoInterval<Date> interval : icoll.withSplits().getIntervals()) {
System.out.println(interval);
}
输出:
[Thu Jan 01 01:00:00 CET 1970/Thu Jan 01 01:00:01 CET 1970)
[Thu Jan 01 01:00:01 CET 1970/Thu Jan 01 01:00:02 CET 1970)
[Thu Jan 01 01:00:02 CET 1970/Thu Jan 01 01:00:05 CET 1970)
[Thu Jan 01 01:00:05 CET 1970/Thu Jan 01 01:00:07 CET 1970)
定义和收集所有区间后的主要调整只是在区间集合上调用withSplits() 。
另一个优点是可以稍微调整代码,以便使用其他类型,如java.time.Instant
Java-8 中的类或内置的 Time4J 类型,如Moment
,等PlainDate
,PlainTimestamp
也很容易实现。