首页 > 解决方案 > 在java中查找多个日期间隔之间的差异

问题描述

我想从给定的间隔集 B、C 和 D 中减去主间隔 A,以获得完全不重叠的日期间隔的输出。B、C 和 D 间隔可以是几年或几个月。但是 A 将只有 90 天。

A = ["2015-01-01 00:00", "2015-01-20 00:00"]
B = ["2015-01-05 00:00", "2015-01-10 00:00"]
C = ["2015-01-11 00:00", "2015-01-14 00:00"]
D = ["2015-01-19 00:00", "2015-01-25 00:00"]

1                  A               20
|----------------------------------|
    |---------|   |----------|   |------------|
    5    B    9  11    C    14  19    D      25

理想的输出:{1,2,3,4,10,15,16,17,18}

1   4         10         15     18
|---|         |          |------|

到目前为止我做了什么?

I have iterated all the entries from A(1-20) in a list and all other entries B,C and D in another list and find out A-(B+C+D).
This is surely the longest way because the duration can be of several years.

请建议最快的方法来做到这一点。

标签: javadateintervalsdifference

解决方案


我的库Time4J根据您的期望 A - (B + C + D)提供对间隔减法的直接支持。

ChronoFormatter<PlainTimestamp> parser = 
  ChronoFormatter.ofTimestampPattern("uuuu-MM-dd HH:mm", PatternType.CLDR, Locale.ROOT);

// my assumption for your input, please adjust the interval pattern if necessary
String intervalPattern = "{0} / {1}";
String sa = "2015-01-01 00:00 / 2015-01-20 00:00";
String sb = "2015-01-05 00:00 / 2015-01-10 00:00"; 
String sc = "2015-01-11 00:00 / 2015-01-14 00:00";
String sd = "2015-01-19 00:00 / 2015-01-25 00:00";

TimestampInterval a = TimestampInterval.parse(sa, parser, intervalPattern);
TimestampInterval b = TimestampInterval.parse(sb, parser, intervalPattern);
TimestampInterval c = TimestampInterval.parse(sc, parser, intervalPattern);
TimestampInterval d = TimestampInterval.parse(sd, parser, intervalPattern);

IntervalCollection<PlainTimestamp> result = 
  IntervalCollection.onTimestampAxis().plus(a).minus(Arrays.asList(b, c, d));

生成的间隔集合包含所需的和预期的间隔(只需调用getIntervals()结果并PlainTimestamp.toTemporalAccessor()转换为LocalDateTime)。默认情况下,这里的所有间隔都是半开的,这意味着开始是包含的,而结束是排他的。因此使用天数和封闭边界 char [ 和开放边界 char ):

[1-5), [10-11), [14-19)

这几乎符合您的期望“{1,2,3,4,10,15,16,17,18}”,除了 14 而不是 15(我认为这只是您问题中的一个错字)。


推荐阅读