[Java] Beispiel für ein Urlaubsurteil

Überblick

Ich wollte Batch nur an Wochentagen ausführen, damit ich Samstage und Sonntage mit cron leicht ausschließen konnte, aber ich konnte Feiertage nicht schnell ausschließen, also entschied Java, dass es ein Feiertag war. Ich habe nicht viele Java-Beispiele gefunden, daher werde ich sie veröffentlichen.

Hinweis

――Transferferien sind etwas kompliziert, daher werde ich sie nicht berücksichtigen

Umgebung

1. Erstellen Sie eine Feiertagsdefinitionsklasse

PublicHoliday.java


package com.tamorieeeen.sample.consts;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 *gesetzlicher Feiertag
 *
 * @author tamorieeeen
 *
 */
@Getter
@AllArgsConstructor
public enum PublicHoliday {

    NEWYEAR("Neuer Tag", "fixed", 1, 1, 0),
    ADULT("Erwachsenentag", "monday", 1, 0, 2),
    FOUNDATION("Gründungstag", "fixed", 2, 11, 0),
    BIRTHDAY("Geburtstag des Kaisers", "fixed", 2, 23, 0),
    SPRING("Vernal Equinox Day", "spring", 3, 0, 0),
    SHOWA("Showa Tag", "fixed", 4, 29, 0),
    CONSTITUTION("Verfassungsjubiläum", "fixed", 5, 3, 0),
    GREEN("Grüner Tag", "fixed", 5, 4, 0),
    CHILDREN("Kindertag", "fixed", 5, 5, 0),
    SEA("Seetag", "monday", 7, 0, 3),
    MOUNTAIN("Bergtag", "fixed", 8, 11, 0),
    AGED("Keiro Tag", "monday", 9, 0, 3),
    AUTUMN("Herbsttag", "autumn", 9, 0, 0),
    SPORTS("Sporttag", "monday", 10, 0, 2),
    CULTURE("Kulturtag", "fixed", 11, 3, 0),
    THANKSGIVING("Labor Thanksgiving Day", "fixed", 11, 23, 0);

    private String name;
    // fixed:Festes Datum
    // monday:Welcher Montag
    // spring:Vernal Equinox Day
    // autumn:Herbsttag
    private String type;
    //Mond
    private int month;
    //Datumstyp:Tag
    private int dayOfMonth;
    //Montag Typ:etwas
    private int weekOfMonth;

    /**
     *Holen Sie sich einen festen Urlaub
     */
    public static List<PublicHoliday> getFixedHoliday() {

        return Stream.of(values())
                .filter(v -> v.type.equals("fixed"))
                .collect(Collectors.toList());
    }

    /**
     *Holen Sie sich einen schönen Montag
     */
    public static List<PublicHoliday> getHappyMonday() {

        return Stream.of(values())
                .filter(v -> v.type.equals("monday"))
                .collect(Collectors.toList());
    }

    /**
     *Holen Sie sich den Frühlingstag
     */
    public static PublicHoliday getSpringDay() {

        return Stream.of(values())
                .filter(v -> v.type.equals("spring"))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException());
    }

    /**
     *Holen Sie sich den Herbsttag
     */
    public static PublicHoliday getAutumnDay() {

        return Stream.of(values())
                .filter(v -> v.type.equals("autumn"))
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException());
    }
}

2. Erstellen Sie eine Urlaubsbeurteilungsklasse

--Verwenden Sie Calendar.DAY_OF_WEEK_IN_MONTH an welchem Montag

HolidayService.java


package com.tamorieeeen.sample.service;

import java.time.LocalDate;
import java.util.Calendar;
import org.springframework.stereotype.Service;

import com.tamorieeeen.sample.consts.PublicHoliday;

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

    //365 für ein Jahr.242194 Tage, also 0 pro Jahr.242 194 Tage voraus
    private static final double DIFF_OF_YEAR = 0.242194;
    //Berechnet ab 1980, einem feuchten Jahr
    private static final int LEAP_YEAR = 1980;
    //Frühjahr 1980 Zeit "20.8431 Tage "
    private static final double SPRING_DAY_BASE = 20.8431;
    //Herbstzeit 1980 "23.2488 Tage "
    private static final double AUTMN_DAY_BASE = 23.2488;

    /**
     *Ob es ein Urlaub ist
     */
    public boolean isHoliday() {

        LocalDate today = LocalDate.now();

        if (this.isFixedHoliday(today) || this.isHappyMonday(today) ||
                this.isSpringDay(today) || this.isAutmnDay(today)) {

            return true;
        }

        return false;
    }

    /**
     *Ob es ein fester Feiertag ist
     */
    private boolean isFixedHoliday(LocalDate today) {

        return PublicHoliday.getFixedHoliday()
                .stream()
                .map(h -> LocalDate.of(
                        today.getYear(), h.getMonth(), h.getDayOfMonth()))
                .anyMatch(h -> h.isEqual(today));
    }

    /**
     *Ob es Happy Monday ist
     */
    private boolean isHappyMonday(LocalDate today) {

        return PublicHoliday.getHappyMonday()
                .stream()
                .map(h -> LocalDate.of(
                        today.getYear(), h.getMonth(),
                        this.getDayOfMonth(h.getMonth(), h.getWeekOfMonth())))
                .anyMatch(h -> h.isEqual(today));
    }

    /**
     *Holen Sie sich Happy Monday Date
     */
    private int getDayOfMonth(int month, int weekOfMonth) {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MONTH, month - 1);
        cal.set(Calendar.DAY_OF_WEEK, 2);
        cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, weekOfMonth);

        return cal.get(Calendar.DAY_OF_MONTH);
    }

    /**
     *Ob es Frühlingstag ist
     */
    private boolean isSpringDay(LocalDate today) {

        int dayOfMonth =
                this.getMovedDays(today.getYear(), SPRING_DAY_BASE)
                - this.getLeapYearDays(today.getYear());
        LocalDate springDay = LocalDate.of(
                today.getYear(),
                PublicHoliday.getSpringDay().getMonth(),
                dayOfMonth);

        return today.isEqual(springDay);
    }

    /**
     *Ob es Herbsttag ist
     */
    private boolean isAutmnDay(LocalDate today) {

        int dayOfMonth =
                this.getMovedDays(today.getYear(), AUTMN_DAY_BASE)
                - this.getLeapYearDays(today.getYear());
        LocalDate autmnDay = LocalDate.of(
                today.getYear(),
                PublicHoliday.getAutumnDay().getMonth(),
                dayOfMonth);

        return today.isEqual(autmnDay);
    }

    /**
     *Holen Sie sich, was los ist
     */
    private int getMovedDays(int year, double baseDay) {

        return (int) Math.floor(baseDay + this.getDiffDays(year));
    }

    /**
     *Holen Sie sich den Unterschied von 1980
     */
    private double getDiffDays(int year) {

        return DIFF_OF_YEAR * (year - LEAP_YEAR);
    }

    /**
     *Holen Sie sich den Betrag des Jahres
     */
    private int getLeapYearDays(int year) {

        return (int) Math.floor((year - LEAP_YEAR) / 4.0);
    }
}

3. Erstellen Sie eine Anrufklasse

--Wenn HolidayService.isHoliday () wahr ist, ist es ein Feiertag. Wenn es falsch ist, ist es ein Wochentag.

SampleController.java


package com.tamorieeeen.sample.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.tamorieeeen.sample.service.HolidayService;

import lombok.extern.slf4j.Slf4j;

/**
 *
 * @author tamorieeeen
 *
 */
@Slf4j
@Controller
public class SampleController {

    @Autowired
    private HolidayService holidayService;

    @GetMapping("/sample")
    public String top() {

        if (holidayService.isHoliday()) {
            log.info("today is holiday.");
        } else {
            log.info("today is weekday.");
        }

        return "sample";
    }
}

Impressionen

Die Berechnung der Frühlings- und Herbsttage ist mühsam!

Referenz

Über das Kabinett "Nationale Feiertage" Finden Sie das Datum des "dritten Montags dieses Monats" Berechnen Sie die Frühlings- und Herbsttage mit PHP

Recommended Posts

[Java] Beispiel für ein Urlaubsurteil
[Java] Generics-Beispiel
Java-Beispielcode 02
Java-Beispielcode 03
Selenprobe (Java)
Java GUI Beispiel
Java-Beispielcode 04
Java-Beispielcode 01
[Java] logback slf4j Beispiel
Java Parallel Code Sample Collection
Beispiel für eine Java-Standardprotokollausgabe
[Java] Mehrfach-ODER-Bedingungsbeurteilung
Selenium Musterbuchungsformular (Java)
Java Unit Test Library-Arterie-Aktuelles Datum Beurteilung
Java 9 neue Funktionen und Beispielcode
Ein einfaches Beispiel für Rückrufe in Java
Java
BloomFilter-Beschreibungs- und Implementierungsbeispiel (JAVA)
[Java] Beispiel für eine Überprüfung des Datumszeitraums
Beispiel für eine EXCEL-Dateiaktualisierung mit JAVA
Java
Beispielautomat mit Java
Beispielcode mit Minio aus Java
Java Unit Test Library-Arterie / JUnit4-Numerische Gleichheitsbeurteilung
[Java] Spam-Beurteilung mittels morphologischer Analyse "lucene-gosen"
Beispiel eines mit Java hergestellten Verkaufsautomaten (Klassifizierung)
[Java] Zeichenbeurteilung / Zeichenfolgenformatierung (AOJ11 - Zeichenanzahl)
Beispiel zum Entpacken einer gz-Datei in Java