Erhältlich am nächsten Werktag nach dem angegebenen Datum bei JAVA

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

public class GetFirstWorkDate {

	public static void main(String[] args) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		// holiday List for test
		List<String> holidayList = new ArrayList<String>();
		holidayList.add("2019-10-13");
		holidayList.add("2019-10-14");
		holidayList.add("2019-10-15");
		// holidayList.add("2019-10-16");
		// holidayList.add("2019-10-17");
		holidayList.add("2019-10-21");

		// start date
		String date = "2019-10-07";
		// first work day
		Date scheduleActiveDate;
		try {
			scheduleActiveDate = getFirstWorkDate(holidayList, date);
			System.out.println("first work day:" + sdf.format(scheduleActiveDate));
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public static Date getFirstWorkDate(List<String> list, String date) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		// init start date
		Date currentDate = sdf.parse(date);
		Date nextDate;
		boolean delayFlg = false;

		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("date", currentDate);
		map.put("delayFlg", delayFlg);

		// get the next work day
		HashMap<String, Object> nextMap = getNextWorkDay(list, map);
		// compare the next work day with start date,if they are the same
		// day,then stop loop and return
		while (!(((Date) map.get("date")).compareTo(((Date) nextMap.get("date"))) == 0)
				|| ((((Date) map.get("date")).compareTo(((Date) nextMap.get("date"))) == 0
						&& (boolean) nextMap.get("delayFlg")))) {
			// reset the start date
			nextDate = (Date) nextMap.get("date");
			currentDate = (Date) map.get("date");
			delayFlg = (boolean) nextMap.get("delayFlg");
			if (currentDate.compareTo(nextDate) == 0 && delayFlg) {
				nextDate = getTargetDaysLater(nextDate, 1);
				delayFlg = false;
			}
			map.put("date", nextDate);
			map.put("delayFlg", delayFlg);
			// get the next work day
			nextMap = getNextWorkDay(list, map);
		}
		return (Date) nextMap.get("date");
	}

	public static HashMap<String, Object> getNextWorkDay(List<String> list, HashMap<String, Object> map)
			throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		HashMap<String, Object> mapTmp = new HashMap<String, Object>();
		Date date = (Date) map.get("date");
		boolean delayFlg = (boolean) map.get("delayFlg");
		Calendar calendar = getCalendar(date);
		if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
			if (isHoliday(sdf.format(date), list)) {
				delayFlg = true;
			}
			date = getTargetDaysLater(date, 1);

		} else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY
				|| calendar.get(Calendar.DAY_OF_WEEK) == Calendar.TUESDAY
				|| calendar.get(Calendar.DAY_OF_WEEK) == Calendar.WEDNESDAY
				|| calendar.get(Calendar.DAY_OF_WEEK) == Calendar.THURSDAY) {
			if (isHoliday(sdf.format(date), list)) {
				date = getTargetDaysLater(date, 1);
			}
		} else if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY) {
			if (isHoliday(sdf.format(date), list)) {
				date = getTargetDaysLater(date, 1);
			}

		} else {
			date = getTargetDaysLater(date, 1);
		}
		// System.out.println("getNextDay:" + sdf.format(date));

		mapTmp.put("date", date);
		mapTmp.put("delayFlg", delayFlg);
		return mapTmp;
	}

	/**
	 * get the delayed date with given days
	 * 
	 * @param Date
	 *            start date
	 * @param int
	 *            delay days
	 * @return
	 */
	public static Date getTargetDaysLater(Date date, int n) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DAY_OF_MONTH, +n);
		date = calendar.getTime();
		return date;
	}

	/**
	 *
	 * @param date
	 * @return Calendar
	 * @throws ParseException
	 */
	public static Calendar getCalendar(Date date) throws ParseException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		return cal;
	}

	/**
	 *
	 * @param sdate
	 * @param list
	 * @return
	 * @throws ParseException
	 */
	public static boolean isHoliday(String sdate, List<String> list) throws ParseException {
		if (list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				if (sdate.equals(list.get(i))) {
					return true;
				}
			}
		}
		return false;
	}
}

Recommended Posts

Erhältlich am nächsten Werktag nach dem angegebenen Datum bei JAVA
So erhalten Sie das Datum mit Java
[Java1.8 +] Mit LocalDate das Datum des nächsten × Tages abrufen
Holen Sie sich das Ergebnis von POST in Java
[Java] Ermittelt den Tag eines bestimmten Tages
[Java] Ermitteln Sie das Datum mit der LocalDateTime-Klasse
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android
Datumsmanipulation in Java 8
Rufen Sie die URL des HTTP-Umleitungsziels in Java ab
Quelle zum Abrufen der Umleitungsquell-URL in Java
[Java] Holen Sie sich das Datum 10 Tage später mit der Calendar-Klasse
[Java] Holen Sie sich die Datei unabhängig von der Umgebung in das JAR
Holen Sie sich EXIF-Informationen in Java
Filtern Sie die optionale Java No. 2-Liste, die im Geschäftsleben nützlich war, und erhalten Sie den ersten Wert
[Java] KClass in Java herunterladen [Kotlin]
Zählen Sie die Anzahl der Stellen nach dem Dezimalpunkt in Java
So leiten Sie den letzten Tag des Monats in Java ab
5. Tag von Java
Aktuelles Datum in Java anzeigen
[Java] Ordnen Sie die Daten des vergangenen Montags und Sonntags der Reihe nach an
Rufen Sie das aktuelle Datum und die aktuelle Uhrzeit ab, indem Sie die Zeitzone in Thymeleaf angeben
Rufen Sie die öffentliche URL der privaten Datei von Flickr in Java ab
So ermitteln Sie die Länge einer Audiodatei mit Java
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Errate den Zeichencode in Java
Datumsverarbeitung in Java (LocalDate: Initialisierung)
[Android] Holen Sie sich das Datum von Montag
Geben Sie den Java-Speicherort in eclipse.ini an
Holen Sie sich null-sichere Map-Werte in Java
Entpacken Sie die Zip-Datei in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
Bleiben Sie in einem Java Primer stecken
Rufen Sie die Super-Methode in Java auf
So erhalten Sie das aktuelle Datum als Zeichenfolge im Format JJJJMMTT
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
So erstellen Sie Ihre eigene Anmerkung in Java und erhalten den Wert
Java-Unit-Test Beurteilung des angegebenen Tages Beurteilen Sie, ob ArDate, Date, Calendar, long der angegebene Tag ist.
Java-Referenz zum Verständnis in der Abbildung
Studieren Sie Java 8 (Datums-API im Paket java.time)
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Implementieren Sie den Algorithmus in Ruby: Tag 1 - Europäische gegenseitige Teilung -
Ich habe das neue Yuan-Problem in Java ausprobiert
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Notizen im Kopf organisieren (Java-Arrangement)
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
[Java] So stellen Sie die Datums- und Uhrzeit auf 00:00:00 ein
Ausgabedatum in Java im erweiterten ISO 8601-Format
[Java] So erhalten Sie das aktuelle Verzeichnis
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Was ist die Hauptmethode in Java?
Löscht nach dem angegebenen Zeichen aus der Zeichenfolge
Abrufen des Verlaufs vom Zabbix-Server in Java
Die Geschichte des Schreibens von Java in Emacs
Konsoleneingabe in Java (Verständnis des Mechanismus)