Lors de l'écriture de la logique métier, vous aurez peut-être besoin d'une date n jours ouvrés plus tard. (Alerte, etc. si le traitement n'est pas effectué dans les n jours ouvrables) Cependant, il est assez difficile de demander cela. Il est facile de calculer si les jours fériés ne sont que les samedis et dimanches, mais il n'y a pas de règles fixes pour les jours fériés. Il est nécessaire de créer et de gérer un master sur votre propre système ou d'obtenir des informations de l'extérieur.
Le premier est gênant car vous devez gérer le maître vous-même, donc cette fois j'ai créé une classe pour vérifier les jours ouvrables par ce dernier moyen.
@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 utilisera l'API des jours fériés du public comme source pour déterminer les jours ouvrables. Cette API renverra la date si la date cible est un jour ouvrable et le jour ouvrable suivant ou précédent si ce n'est pas un jour ouvrable. Par conséquent, vous pouvez trouver la date n jours ouvrables plus tard (ou avant) en exécutant la méthode de frappe de l'API tout en décalant la date d'un jour jusqu'à ce qu'elle atteigne n. De plus, OkHttp est utilisé pour frapper l'API.
Comme l'accès API à l'extérieur est une logique sandwich et récursive, il est réaliste que la valeur de n soit au plus autour de 10. Si vous essayez de demander quelque chose comme 100 jours ouvrables plus tard, ce sera difficile. (Je ne pense pas qu'il y ait grand-chose dans les affaires) Si vous en avez besoin, il est plus sûr d'utiliser une autre méthode.