Auf Zeitinterval in Zeitinterval prüfen

H

Hans P

Hallo ich stehe gerade ein wenig auf dem Schlauch.

Das Ziel ist es von startDate1, endDate1, startDate2 und endDate2, zu prüfen ob des 2te Interval in ersterem liegt, und zu wieviel "Prozent" es in besagtem Zeitraum liegt.

Beispiel:
startDate1: 1.1.2010
endDate1: 25.1.2010

startDate2: 10.1.2010
endDate2: 1.2.2010

-> Das zweite Intervall überschneidet sich mit dem ersten um 15 Tage (von 25 gesamt Tagen im Intervall 1) -> zu 60 % überschnitt

oder:
startDate1: 1.1.2010
endDate1: 5.1.2010

startDate2: 5.1.2010
endDate2: 12.12.2010

-> Das zweite Intervall überschneidet sich mit dem ersten um 1 Tag (von 5 Tagen) -> 20 % überschnitt.

Hat mir wer zu besagtem Algorithmus einen Lösungsansatz / Tipp ?

Danke
 
Moin,

mal so aus dem Bauch heraus:

Prüfe :
- startDate1 vs. startDate2
- endDate1 vs. startDate2
- startDate1 vs. endDate2
- endDate1 vs. endDate2

Stelle dabei ggf. Differenzen fest, addiere diese und rechne sie in Prozent um ....... :rolleyes:

Gruß
Klaus
 
Hallo,

schau dir mal jodatime an:
http://joda-time.sourceforge.net/index.html
Java:
package de.tutorials;

import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Interval;
import org.joda.time.LocalDate;

public class TimeOverlap {
	public static void main(String[] args) {
		Interval a = new Interval(startOfDay(new LocalDate(2010, 1, 1)), startOfDay(new LocalDate(2010, 1, 25)));
		Interval b = new Interval(startOfDay(new LocalDate(2010, 1, 10)), startOfDay(new LocalDate(2010, 2, 1)));

		printOverlapWithEndIncluded(a, b);

		Interval c = new Interval(startOfDay(new LocalDate(2010, 1, 1)), startOfDay(new LocalDate(2010, 1, 5)));
		Interval d = new Interval(startOfDay(new LocalDate(2010, 1, 5)), startOfDay(new LocalDate(2010, 12, 12)));
		printOverlapWithEndIncluded(c, d);
	}

	private static void printOverlapWithEndIncluded(Interval first, Interval second) {
		
		//interval.overlap(interval) is start inclusive, end exclusive ...  
		boolean successionalIntervals = first.getEnd().equals(second.getStart());
		int daysOverlap = Days.daysIn(second.overlap(first)).getDays() + (successionalIntervals ? 1 : 0);
		
		boolean endDateInlcuded = second.contains(first.getEnd().toDateTime());
		int daysInFirst = Days.daysIn(first).getDays() + (endDateInlcuded ? 1 : 0);

		System.out.println(daysOverlap + " " + daysOverlap / (double) daysInFirst);
	}

	public static DateTime startOfDay(LocalDate d) {
		return d.toDateTimeAtStartOfDay();
	}
}

Ausgabe:
Code:
15 0.6
1 0.2

Gruß Tom
 
Zurück