if ((von2.before(von1) && von1.before(bis2))
|| (von2.before(bis1) && bis1.before(bis2))
|| (von1.before(von2) && bis2.before(bis1))) {
[...]
}
if (von1.before(bis2) && von2.before(bis1)) { ... }
boolean ueberschneidung = bis1.compareTo(von2) < 0
|| bis2.compareTo(von1) < 0;
müsste so funktionieren:Zur Not kann man "<" auch noch durch "<=" ersetzen.Java:boolean ueberschneidung = bis1.compareTo(von2) < 0 || bis2.compareTo(von1) < 0;
es gibt in der hinsicht viele faelle - aber alle kann man subsummieren auf den von spacerat bzw mein bsp.Aber es gibt doch im ganzen 3 Cases...:
1. von1 liegt zwischen von2 und bis2
2. bis1 liegt zwischen von2 und bis2
3. von1 ist vor von2 und bis1 ist nach bis2
Und Spacerat's Lösung checkt nur Punkt 1.
interessant:rtfm:
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, 2); // maerz 2009
Date von1 = calendar.getTime();
calendar.set(Calendar.MONTH, 11); // dezember 2009
Date bis2 = calendar.getTime();
calendar.set(Calendar.MONTH, 8); // September 2009
Date bis1 = calendar.getTime();
Date von2 = new Date(); // Juli 2009
boolean ueberschneidung = bis1.compareTo(von2) < 0 || bis2.compareTo(von1) < 0;
System.out.println(ueberschneidung); false
System.out.println(von1.before(bis2) && von2.before(bis1)); // true
!(bis1.compareTo(von2) < 0 || bis2.compareTo(von1) < 0)
siehe link@deathbyaclown:... hast ja recht... aber warum negieren? aus "<" wird ">"... oder etwa doch nicht? Bin mir plötzlich gar nicht mehr so sicher...
Du kannst auch folgendes machen, denn mit before und after bekommst Du irgendwann einen Knoten im Kopf:
Schreib Dir eine neue Date-Klasse.
Die Klasse hat einen Index und den Datumswert.
Überschreibe compareTo und equals.
Packe alle Deine neuen Datumsobjekte in eine List.
Sortiere die Liste.
Iteriere durch alle Einträge und gucke ob der Index mit dem Schleifenzähler übereinstimmt.
Wenn ja, liegen alle Datumswerte hintereinander.
Wenn nein, überlappen sie sich.
Doch eher so, oder?aus "<" wird ">"... oder etwa doch nicht?
¬(A < B) ≍ (A ≥ B)
mhm lass mal überlegen... entweder ich schreib n einzeiler mit before bzw compareTo oder ich schreib eine eigene Klasse, überschreib methoden, erstelle eine liste, lasse sie sortieren, iteriere und muss dann richtig vergleichen....simpel?
komplex?
wenn du meinst...
Ich halte before und after für wesentlich komplexer, aber egal
import java.util.Calendar;
import java.util.Date;
public class Overlap
{
public static void main(String ... args)
{
Calendar calendar = Calendar.getInstance();
// Ueberschneidung
calendar.set(Calendar.MONTH, 2); // maerz 2009
Date von1 = calendar.getTime();
calendar.set(Calendar.MONTH, 8); // September 2009
Date bis1 = calendar.getTime();
Date von2 = new Date(); // Juli 2009
calendar.set(Calendar.MONTH, 11); // dezember 2009
Date bis2 = calendar.getTime();
boolean ueberschneidung = bis1.compareTo(von2) > 0 || bis2.compareTo(von1) < 0;
System.out.println(ueberschneidung);
System.out.println(von1.before(bis2) && von2.before(bis1));
// keine Ueberschneidung
calendar.set(Calendar.MONTH, 2); // maerz 2009
von1 = calendar.getTime();
calendar.set(Calendar.MONTH, 5); // Mai 2009
bis1 = calendar.getTime();
von2 = new Date(); // Juli 2009
calendar.set(Calendar.MONTH, 11); // dezember 2009
bis2 = calendar.getTime();
ueberschneidung = bis1.compareTo(von2) > 0 || bis2.compareTo(von1) < 0;
System.out.println(ueberschneidung); // false
System.out.println(von1.before(bis2) && von2.before(bis1));
// Abschnitt 2 in Abschnitt 1 (Überschneidung)
calendar.set(Calendar.MONTH, 2); // maerz 2009
von1 = calendar.getTime();
calendar.set(Calendar.MONTH, 11); // Dezember 2009
bis1 = calendar.getTime();
von2 = new Date(); // Juli 2009
calendar.set(Calendar.MONTH, 7); // August 2009
bis2 = calendar.getTime();
ueberschneidung = bis1.compareTo(von2) > 0 || bis2.compareTo(von1) < 0;
System.out.println(ueberschneidung);
System.out.println(von1.before(bis2) && von2.before(bis1));
// Abschnitt 1 in Abschnitt 2 (Überschneidung)
calendar.set(Calendar.MONTH, 2); // maerz 2009
von2 = calendar.getTime();
calendar.set(Calendar.MONTH, 11); // Dezember 2009
bis2 = calendar.getTime();
von1 = new Date(); // Juli 2009
calendar.set(Calendar.MONTH, 7); // August 2009
bis1 = calendar.getTime();
ueberschneidung = bis1.compareTo(von2) > 0 || bis2.compareTo(von1) < 0;
System.out.println(ueberschneidung);
System.out.println(von1.before(bis2) && von2.before(bis1));
}
}
true
true
false
false
true
true
true
true
von1.before(bis2) && von2.before(bis1)
bis1.compareTo(von2) > 0 || bis2.compareTo(von1) < 0
Der Haken ist die logische Negation. Und das Quadrat sagt, dass Du das Unicode-Zeichen für "equivalent to" nicht in Deinem Font hast:@Ebenius: mit deiner Formel(?) kann ich irgendwie nichts anfangen... für mich liest sich das wie "komischer Haken(A<B)Quadrat(A>=B)". Ok der "komische Haken" könnte eine negation bedeuten. Aber was bedeutet das Quadrat?
Also ich habe mir nur Deinen Link angeschaut und wurde erschlagen von mehreren DIN A4 Seiten an Hinweisen und Vorgehensweisen. Deinen Einzeiler habe ich nicht überprüft.
Aber im Hinblick auf Wiederverwendbarkeit, kann man sich doch wohl einmal die Arbeit machen oder nicht?