[Java] Exemple de jugement de vacances

Aperçu

Je voulais exécuter des lots uniquement les jours de la semaine, donc je pouvais facilement exclure les samedis et dimanches avec cron, mais je ne pouvais pas exclure les vacances rapidement, alors Java a décidé que c'était des vacances. Je n'ai pas trouvé beaucoup d'exemples Java, je vais donc les publier.

Mise en garde

―― Les vacances de transfert sont un peu compliquées donc je ne les considérerai pas

environnement

1. Créez une classe de définition de vacances

--Date fixe, bon lundi, jour de printemps, jour d'automne 4 modèles

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;

/**
 *jour férié
 *
 * @author tamorieeeen
 *
 */
@Getter
@AllArgsConstructor
public enum PublicHoliday {

    NEWYEAR("Nouveau jour", "fixed", 1, 1, 0),
    ADULT("Journée adulte", "monday", 1, 0, 2),
    FOUNDATION("jour fondation", "fixed", 2, 11, 0),
    BIRTHDAY("Anniversaire de l'empereur", "fixed", 2, 23, 0),
    SPRING("Journée de l'équinoxe vernal", "spring", 3, 0, 0),
    SHOWA("Showa Day", "fixed", 4, 29, 0),
    CONSTITUTION("Anniversaire constitutionnel", "fixed", 5, 3, 0),
    GREEN("Jour vert", "fixed", 5, 4, 0),
    CHILDREN("La journée des enfants", "fixed", 5, 5, 0),
    SEA("Journée de la mer", "monday", 7, 0, 3),
    MOUNTAIN("Journée de montagne", "fixed", 8, 11, 0),
    AGED("Journée Keiro", "monday", 9, 0, 3),
    AUTUMN("Jour d'automne", "autumn", 9, 0, 0),
    SPORTS("Journée sportive", "monday", 10, 0, 2),
    CULTURE("Journée de la culture", "fixed", 11, 3, 0),
    THANKSGIVING("Action de grâce du travail", "fixed", 11, 23, 0);

    private String name;
    // fixed:Date fixe
    // monday:Quel lundi
    // spring:Journée de l'équinoxe vernal
    // autumn:Jour d'automne
    private String type;
    //Mois
    private int month;
    //Type de date:journée
    private int dayOfMonth;
    //Lundi type:Quelque chose
    private int weekOfMonth;

    /**
     *Obtenez des vacances fixes
     */
    public static List<PublicHoliday> getFixedHoliday() {

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

    /**
     *Soyez heureux lundi
     */
    public static List<PublicHoliday> getHappyMonday() {

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

    /**
     *Obtenez le jour du printemps
     */
    public static PublicHoliday getSpringDay() {

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

    /**
     *Obtenez le jour d'automne
     */
    public static PublicHoliday getAutumnDay() {

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

2. Créez une classe de jugement de vacances

--Utiliser Calendar.DAY_OF_WEEK_IN_MONTH quel lundi --Spring Day: ʻint (20.8431 + 0.242194 * (year-1980) -int ((year-1980) / 4)) --Jour d'Automne: ʻint (23.2488 + 0.242194 * (year-1980) -int ((year-1980) / 4))

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 pour un an.242194 jours, soit 0 par an.242194 jours d'avance
    private static final double DIFF_OF_YEAR = 0.242194;
    //Calculé à partir de 1980, année humide
    private static final int LEAP_YEAR = 1980;
    //Heure du printemps 1980 "20.8431 jours "
    private static final double SPRING_DAY_BASE = 20.8431;
    //Période d’automne 1980 "23.2488 jours "
    private static final double AUTMN_DAY_BASE = 23.2488;

    /**
     *Que ce soit des vacances
     */
    public boolean isHoliday() {

        LocalDate today = LocalDate.now();

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

            return true;
        }

        return false;
    }

    /**
     *Que ce soit un jour férié fixe
     */
    private boolean isFixedHoliday(LocalDate today) {

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

    /**
     *Que ce soit Happy Monday
     */
    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));
    }

    /**
     *Soyez heureux lundi
     */
    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);
    }

    /**
     *Que ce soit le printemps
     */
    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);
    }

    /**
     *Que ce soit le jour d'automne
     */
    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);
    }

    /**
     *Obtenez ce qui se passe
     */
    private int getMovedDays(int year, double baseDay) {

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

    /**
     *Faites la différence par rapport à 1980
     */
    private double getDiffDays(int year) {

        return DIFF_OF_YEAR * (year - LEAP_YEAR);
    }

    /**
     *Obtenez le montant de l'année
     */
    private int getLeapYearDays(int year) {

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

3. Créez une classe d'appel

--Si holidayService.isHoliday () est vrai, c'est un jour férié, s'il est faux, c'est un jour de la semaine.

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";
    }
}

Impressions

Le calcul des jours de printemps et d'automne est gênant!

référence

À propos des «fêtes nationales» du Cabinet Office Trouvez la date du "troisième lundi de ce mois" Calculez les jours de printemps et d'automne avec PHP

Recommended Posts

[Java] Exemple de jugement de vacances
[Java] Exemple de génériques
Exemple de code Java 02
Exemple de code Java 03
Échantillon de sélénium (Java)
Exemple d'interface graphique Java
Exemple de code Java 04
Exemple de code Java 01
[Java] exemple de logback slf4j
Collection d'exemples de code parallèle Java
Exemple de sortie de journal standard Java
[Java] Jugement de condition OR multiple
Formulaire de réservation d'échantillons de sélénium (Java)
Jugement de la date actuelle de la bibliothèque de tests unitaires Java
Nouvelles fonctionnalités de Java 9 et exemple de code
Un exemple simple de rappels en Java
Java
Exemple de description et d'implémentation de BloomFilter (JAVA)
[Java] Exemple de contrôle de duplication de période de date
Exemple de mise à jour de fichier EXCEL avec JAVA
Java
Distributeur automatique d'échantillons fabriqué avec Java
Exemple de code utilisant Minio de Java
Bibliothèque de tests unitaires Java-Artery / JUnit4-Jugement d'égalité numérique
[Java] Jugement de spam utilisant l'analyse morphologique "lucene-gosen"
Échantillon de distributeur automatique fabriqué avec Java (classification)
[Java] Jugement de caractères / formatage de la chaîne de caractères (AOJ11 - nombre de caractères)
Exemple pour décompresser le fichier gz en Java