[Java] Beispiel für eine Überprüfung des Datumszeitraums

Überblick

Bei der Registrierung von Daten mit einem Zeitraum nach Datum möchte ich sicherstellen, dass sie sich nicht mit dem bereits registrierten Zeitraum überschneiden. Ich habe mit LocalDate nicht viele Java-Beispiele gefunden, daher werde ich sie veröffentlichen.

Umgebung

Muster mit überlappenden Perioden

Es gibt insgesamt vier Muster mit überlappenden Datumsperioden. Qiita用画像.png

  1. Muster, das die erste Hälfte trägt (einschließlich des gleichen Enddatums von ① und des grünen Startdatums)
  2. Muster, dass die zweite Hälfte abgedeckt ist (einschließlich des gleichen Startdatums von ② und des grünen Enddatums)
  3. All-Wear-Muster (einschließlich genau des gleichen Start- und Enddatums)
  4. Teilweise abgenutztes Muster

Der bedingte Ausdruck, der alle Muster abdecken kann, lautet wie folgt.

Bedingter Ausdruck


Grün.Anfangsdatum<=schwarz.Endtermin&& Grün.Endtermin=>schwarz.Anfangsdatum

Stichprobe

Ein Beispiel, mit dem Sie das Start- und Enddatum auf dem Bildschirm eingeben und nur registrieren können, wenn sich die Eingabeperiode nicht mit den vorhandenen Perioden überschneidet.

Modellklasse mit einem zu registrierenden Datumszeitraum

Modellklasse, die mit dem zu registrierenden Start- und Enddatum sowie der ID der automatischen Nummerierung an den Bildschirm übergeben werden soll.

DurationModel.java


package com.tamorieeeen.sample.model;

import java.time.LocalDate;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 *
 * @author tamorieeeen
 *
 */
@Getter
@Setter
@NoArgsConstructor
public class DurationModel {

    //Auto beim Speichern_Nummerierung mit Inkrement
    private int id;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate startDate;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate endDate;
}

Bewertungslogik für die Periodenverdoppelung Serviceklasse

Vom Controller aufgerufene Serviceklasse.

DurationService.java


package com.tamorieeeen.sample.service;

import java.time.LocalDate;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.tamorieeeen.sample.model.DurationModel;

/**
 *
 * @author tamorieeeen
 *
 */
@Service
public class DurationService {

    /**
     *Überprüfen Sie, ob es bereits registriert ist
     */
    public boolean isInvalid(DurationModel model) {

        return this.getDurationList()
                .stream()
                .filter(u -> model.getId() != u.getId()) // ※1
                .anyMatch(u ->
                        (order.getStartDate().isBefore(u.getEndDate())
                        && order.getEndDate().isAfter(u.getStartDate()))
                        || order.getStartDate().isEqual(u.getEndDate())
                        || order.getEndDate().isEqual(u.getStartDate()));
    }

    /**
     *Liste abrufen
     */
    private List<DurationModel> getDurationList() {

        //TODO Bereits registrierte Daten abrufen
    }

    /**
     *Anmelden/aktualisieren
     */
    @Transactional
    public void saveDuration(DurationModel model) {

        //Datenspeicherungsprozess in TODO DB etc.
    }
}

Controller-Klasse

Tatsächlich werden "@ Validated" und "BindingResult" für die Validierungsprüfung verwendet, aber dieser Teil wird weggelassen.

DurationController.java


/**
 *
 * @author tamorieeeen
 *
 */
@Controller
public class DurationController {

    @Autowired
    private DurationService durationService;

    /**
     *Anmelden
     */
    @GetMapping("/duration/register")
    public String register(Model model) {

        model.addAttribute("duration", new DurationModel());

        return "duration/register";
    }

    /**
     *Neuer Registrierungsprozess
     */
    @PostMapping("/duration/register")
    public String registerComplete(Model model,
            @ModelAttribute("duration") DurationModel duration,
            RedirectAttributes redirect) {

        //Validierungsprüfung
        if (durationService.isInvalid(duration)) {

            model.addAttribute("invalid", true);

            return "duration/register";
        }

        durationService.saveDuration(duration);

        redirect.addFlashAttribute("complete", true);

        return "redirect:/duration/register";
    }
}

Bildschirmseite HTML (Thymeleaf)

Der HTML-Header ist häufig, aber diesmal nicht relevant, sodass er weggelassen wird.

register.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="common :: meta_header('sample',~{::link},~{::script},~{::meta})">
</head>
<body>
    <div th:if="${complete}">
        <p>Ich habe den Zeitraum registriert.</p>
    </div>
    <div th:if="${invalid}">
        <p>Eine Registrierung ist nicht möglich, da der Zeitraum doppelt vorhanden ist.</p>
    </div>
    <form th:action="@{/duration/register}" method="post" th:object="${duration}">
        <table>
            <tr><td>Anfangsdatum</td><td>
                <input type="date" th:field="*{startDate}" th:value="*{startDate}" />
            </td></tr>
            <tr><td>Endtermin</td><td>
                <input type="date" th:field="*{endDate}" th:value="*{endDate}" />
            </td></tr>
        </table>
        <input type="button" th:value="zu registrieren" onclick="submit();" />
    </form>
</body>
</html>

Referenz

Recommended Posts

[Java] Beispiel für eine Überprüfung des Datumszeitraums
Überprüfung der Periodenduplizierung (LocalTime, LocalDate, LocalDateTime)
Java-Beispielcode 02
Java-Versionsprüfung
Java-Beispielcode 03
Selenprobe (Java)
Java GUI Beispiel
Java-Support-Zeitraum
Supportzeitraum für Java8, 9, 10
Java-Überprüfungsprozess
Java-Beispielcode 01
Überprüfen Sie die Implementierung von Java toString ()
[Java] Beispiel für ein Urlaubsurteil
Grundlegende Java-Datumsmanipulation
[Java] logback slf4j Beispiel
Datumsmanipulation in Java 8
Java: Datum hinzufügen [Hinweis]
[Java] Konvertierung des Datumstyps
Beispielcode zum Parsen von Datum und Uhrzeit mit Java SimpleDateFormat
Beispielcode für elektronische Signatur (JAVA)
Java Parallel Code Sample Collection
Überprüfen Sie die private Methode der Java9-Schnittstelle
Überprüfen Sie die https-Verbindung mit Java
Beispiel für eine Java-Standardprotokollausgabe
[Java] Datum Verwandte Begriffsnotiz
Selenium Musterbuchungsformular (Java)
Aktuelles Datum in Java anzeigen