组合两个Joda-Time Interval对象

时间:2013-12-27 18:41:59

标签: java date datetime jodatime

Joda-Time中,有没有办法将Interval创建为两个其他区间的并集。我知道有一种叫做overlap(和overlaps)的交集方法。但我看不到任何工会方法。

2 个答案:

答案 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