Fragen Sie n Werktage später bei JAVA nach

Fragen Sie n Werktage später bei JAVA nach

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.

Was wurde gemacht


@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);
	}
}

Kommentar

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.

wichtiger Punkt

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

Fragen Sie n Werktage später bei JAVA nach
[Java] Holen Sie sich das Datum 10 Tage später mit der Calendar-Klasse
Aktivieren Sie OpenCV mit Java8. (Für mich)
Erste Schritte mit Ruby für Java-Ingenieure
Lernen Sie aus "Na und", den Grundlagen von Java [für Anfänger]
Tipps zur Interoperabilität mit Kotlin zum Senden an Java-Entwickler
Beispiel für eine Gegenmaßnahme gegen NullPointerException (optional) für Java8 oder höher
Links & Memos für den Einstieg in Java (für mich)
Lesen Sie den Hinweis zur Dateikopie von Java 1.7 oder höher
Einfaches Hindernisrennen mit Java-Verarbeitung
Java Nr. 3 für die Stream-Speichernutzung, die für Unternehmen nützlich ist
Docker Container Operations mit Docker-Client API für Java
Für JAVA-Lernen (2018-03-16-01)
2017 IDE für Java
/ n \ n Docker Java
Java für Anweisung
Java-Programmierübungen für Neulinge, die bei aktiven Ingenieuren unbeliebt sind
[Java-Grundlagen] Lassen Sie uns ein Dreieck mit einer for-Anweisung erstellen
Rufen Sie den Azure App Service für die Java-Konfiguration mit System.getEnv () ab.
Generieren Sie Dummy-Daten für verschiedene Tests mit Faker (Java)
[Java] Umgebungskonstruktionsverfahren zum Entwickeln von Streben 1.3 mit Eclipse
Versuchen Sie, mit Java eine Verbindung zu AzureCosmosDB Emulator for Docker herzustellen
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor