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.
―― Les vacances de transfert sont un peu compliquées donc je ne les considérerai pas
--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());
}
}
--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);
}
}
--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";
}
}
Le calcul des jours de printemps et d'automne est gênant!
À 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