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.
――Transferferien sind etwas kompliziert, daher werde ich sie nicht berücksichtigen
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());
}
}
--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);
}
}
--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";
}
}
Die Berechnung der Frühlings- und Herbsttage ist mühsam!
Ü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