Wenn Sie Geschäftslogik schreiben, benötigen Sie möglicherweise ein Datum n Werktage später. (Warnung usw., wenn die Verarbeitung nicht innerhalb von n Werktagen erfolgt) Es ist jedoch ziemlich mühsam, danach zu fragen. Es ist leicht zu berechnen, ob die Feiertage nur Samstage und Sonntage sind, aber es gibt keine festen Regeln für Feiertage. Sie müssen einen Master auf Ihrem System erstellen und verwalten oder Informationen von außen erhalten.
Ersteres ist problematisch, weil Sie den Master selbst verwalten müssen. Deshalb habe ich dieses Mal eine Klasse erstellt, um die Geschäftstage mit letzterem zu überprüfen.
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class BusinessDayApiAccessorServiceImpl implements BusinessDayApiAccessor {
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("uuuuMMdd");
private final OkHttpClient client;
@Override
public LocalDate getBusinessDayAfter(LocalDate baseDate, int days) {
return getBusinessDay(true, baseDate, days);
}
@Override
public LocalDate getBusinessDayBefore(LocalDate baseDate, int days) {
return getBusinessDay(false, baseDate, days);
}
private LocalDate getBusinessDay(boolean isNext, LocalDate baseDate, int days) {
if (days == 0) {
return baseDate;
}
return getBusinessDay(isNext, sendRequest(isNext, isNext ? baseDate.plusDays(1) : baseDate.minusDays(1)),
days - 1);
}
private LocalDate sendRequest(boolean isNext, LocalDate baseDate) {
HttpUrl httpUrl = new HttpUrl.Builder().scheme("http").host("s-proj.com").addPathSegment("utils")
.addPathSegment("getBusinessDay.php").addQueryParameter("kind", isNext ? "next" : "prev")
.addQueryParameter("date", baseDate.format(DATE_FORMATTER)).build();
Request request = new Request.Builder().url(httpUrl).get().build();
try (Response response = client.newCall(request).execute()) {
String resultBody = response.body().string();
return LocalDate.parse(resultBody, DATE_FORMATTER);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean isBusinessDay(LocalDate date) {
return sendRequest(true, date).isEqual(date);
}
}
National Holiday Check verwendet die Feiertags-API der Öffentlichkeit als Quelle für die Bestimmung von Geschäftstagen. Diese API gibt das Datum zurück, wenn das Zieldatum ein Geschäftstag ist, und den nächsten oder vorherigen Geschäftstag, wenn es kein Geschäftstag ist. Daher können Sie das Datum n Werktage später (oder früher) ermitteln, indem Sie die Methode zum Aufrufen der API ausführen, während Sie das Datum um einen Tag verschieben, bis es n erreicht. Darüber hinaus wird OkHttp verwendet, um die API zu treffen.
Da der API-Zugriff nach außen eine Sandwich- und rekursive Logik ist, ist es realistisch, dass der Wert von n höchstens bei 10 liegt. Wenn Sie versuchen, etwa 100 Werktage später nach etwas zu fragen, wird es schwierig. (Ich glaube nicht, dass es viel im Geschäft gibt) Wenn Sie es brauchen, ist es sicherer, eine andere Methode zu verwenden.
Recommended Posts