7 Stimmen

Java Daten vergleichen, um zu prüfen, ob sie im Bereich liegen

Ok, nicht so einfach, wie es der Titel vermuten lässt. Ich habe dies in einer sehr primitiven Weise mit c# versucht und es hat funktioniert, aber ich habe das Gefühl, dass eine bessere Arbeit mit Java und Oracle als Datenbank erreicht werden könnte. Also die Sache ist:

Ich habe ein Reservierungssystem, bei dem mehrere Buchungen am selben Tag für den Zeitraum zwischen Datum X und Datum Y vorgenommen werden können, solange jeder Tag in diesem Bereich die gewünschte Anzahl von Buchungen aufnehmen kann. Die maximale Anzahl von Clustern, die reserviert werden können, ist 46. Logischerweise würde man also jeden Tag als Inhaber einer Reservierung von 46 Clustern betrachten und daraus ableiten.

Was ich aber nur schwer herausfinden kann, ist:

wenn n Buchungen in der Datenbank gespeichert und gültig sind, dann möchte ich eine neue Buchung vornehmen. Wie kann ich also überprüfen, ob dieser neue Datumsbereich in einen der zuvor gebuchten Tage fällt oder nicht. Ich spreche hier nicht einfach davon, dass x in y fällt (als Bereiche). Mehr wie:

   X_______________________________________Y
       X________________________________y
  X________________________________Y
                         X________________________________Y

Wie Sie sehen können, kommt es zu einer Überschneidung.

Bitte lassen Sie mich wissen, wie ich dies tun kann, da es sich auf den frühen Entwurf von Objekten auswirken wird. Mit freundlichen Grüßen

8voto

corsiKa Punkte 79125

Nehmen Sie an, Ihr Datum hat zwei Methoden: isBefore(Date other) y isAfter(Date other) . Wenn das nicht der Fall ist, kann man das natürlich mit einer externen Methode oder einem Wrapping oder so beheben. Bearbeiten: java.util.Date hat compareTo Methode, die Sie verwenden können.

Sie tun dies:

public boolean overlapsWithExisting(Booking booking) {
    final Date early = booking.getStart();
    final Date late = booking.getEnd();
    for(Booking existing : existingBookings) {
        if(!(early.isAfter(existing.getEnd()) || late.isBefore(existing.getStart()))
            return true;
    }
    return false;
}

Wir vergleichen diese Buchung mit allen bestehenden Buchungen. Wenn diese Buchung endet, bevor die bestehende Buchung überhaupt beginnt, oder wenn diese Buchung beginnt, nachdem die bestehende Buchung endet, dann gibt es keinen Konflikt. Jede andere Bedingung führt zu einer Überschneidung.

Tun Sie dies bei jeder Buchung.

1voto

Basil Bourque Punkte 256611

Joda-Time - Interval

Anstatt selbst zu rollen, verwenden Sie die Interval Klasse in der Joda-Time Bibliothek. Ein Intervall ist ein Paar bestimmter Punkte auf der Zeitachse, die jeweils als DateTime Instanz.

En Interval Klasse bietet overlap , gap y abuts Methoden.

Halboffen

Diese Methoden verwenden klugerweise den halboffenen Ansatz für Zeitspannen, bei denen der Anfang inklusiv ist, während das Ende exklusiv ist. Suchen Sie auf StackOverflow nach weiteren Informationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X