答案 0 :(得分:7)
如果您想要一个“覆盖”其他两个的间隔,只需创建一个从min(a.start, b.start)
到max(a.end, b.end)
的新间隔。
如果您还需要表示差距,那么您需要编写自己的类来处理所需的行为。由于对“联合”非连续区间的意义有几种可能的解释,因此对于Joda-时间没有任何建议。
答案 1 :(得分:4)
answer by Jim Garrison是正确的,但很简短。我决定尝试实施。在Mac上使用Joda-Time 2.3和Java 7。
如果你大量使用这种“联合”方法,也许你应该考虑创建一个Interval
的子类来添加一个方法,你传递一个(第二个)Interval来与第一个进行比较,正在调用方法的人。
对于偶尔使用,静态方法在某些实用程序类上停留就足够了。这就是我在这里写的,一种静态方法,你传递一对间隔。返回一个新的Interval。
我的示例代码不是使用多行if
语句,而是使用?:
ternary operator将第一个或第二个DateTime的决定合并为一行。
静态方法......
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
static Interval union( Interval firstInterval, Interval secondInterval )
{
// Purpose: Produce a new Interval instance from the outer limits of any pair of Intervals.
// Take the earliest of both starting date-times.
DateTime start = firstInterval.getStart().isBefore( secondInterval.getStart() ) ? firstInterval.getStart() : secondInterval.getStart();
// Take the latest of both ending date-times.
DateTime end = firstInterval.getEnd().isAfter( secondInterval.getEnd() ) ? firstInterval.getEnd() : secondInterval.getEnd();
// Instantiate a new Interval from the pair of DateTime instances.
Interval unionInterval = new Interval( start, end );
return unionInterval;
}
使用示例......
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;
// Note the various time zones.
Interval i1 = new Interval( new DateTime( 2013, 1, 1, 0, 0, 0, DateTimeZone.forID( "America/Montreal" ) ), new DateTime( 2013, 1, 5, 0, 0, 0, DateTimeZone.forID( "America/Montreal" ) ) );
Interval i2 = new Interval( new DateTime( 2013, 1, 10, 0, 0, 0, DateTimeZone.forID( "Europe/Paris" ) ), new DateTime( 2013, 1, 15, 0, 0, 0, DateTimeZone.forID( "Europe/Paris" ) ) );
Interval i3 = TimeExample.union( i1, i2 );
转储到控制台...
System.out.println("i1: " + i1 );
System.out.println("i2: " + i2 );
// Note that Joda-Time adjusts the ending DateTime's time zone to match the starting one.
System.out.println("i3: " + i3 );
跑步时......
i1: 2013-01-01T00:00:00.000-05:00/2013-01-04T18:00:00.000-05:00
i2: 2013-01-10T00:00:00.000+01:00/2013-01-15T00:00:00.000+01:00
i3: 2013-01-01T00:00:00.000-05:00/2013-01-14T18:00:00.000-05:00