Obtenu le jour ouvrable suivant la date spécifiée avec 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

Obtenu le jour ouvrable suivant la date spécifiée avec JAVA
Comment obtenir la date avec Java
[Java1.8 +] Obtenez la date du jour × suivant avec LocalDate
Obtenez le résultat de POST en Java
[Java] Obtenez le jour d'un jour spécifique
[Java] Obtenez la date avec la classe LocalDateTime
Représente le «jour suivant» et le «jour précédent» en Java / Android
Manipulation de la date dans Java 8
Obtenez l'URL de la destination de la redirection HTTP en Java
Source utilisée pour obtenir l'URL de la source de redirection en Java
[Java] Obtenez la date 10 jours plus tard avec la classe Calendar
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement
Obtenir des informations EXIF en Java
Filtrez la liste facultative Java n ° 2 utile en entreprise et obtenez la première valeur
[Java] Obtenir KClass en Java [Kotlin]
Comptez le nombre de chiffres après la virgule décimale en Java
Comment dériver le dernier jour du mois en Java
5ème jour de Java
Afficher la date actuelle en Java
[Java] Obtenez les dates des derniers lundi et dimanche dans l'ordre
Obtenez la date et l'heure actuelles en spécifiant le fuseau horaire dans Thymeleaf
Obtenez l'URL publique du fichier privé de Flickr en Java
Comment obtenir la longueur d'un fichier audio avec Java
Accéder à l'interface réseau avec Java
Devinez le code de caractère en Java
Traitement de la date en Java (LocalDate: Initialization)
[Android] Obtenez la date du lundi
Spécifiez l'emplacement Java dans eclipse.ini
Obtenir des valeurs de carte nulles en Java
Décompressez le fichier zip en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Restez coincé dans un Java Primer
Appelez la super méthode en Java
Comment obtenir la date actuelle sous forme de chaîne au format aaaaMMjj
Ceci et cela de la mise en œuvre du jugement en temps réel des dates en Java
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
Comment créer votre propre annotation en Java et obtenir la valeur
Test unitaire Java Jugement du jour spécifié Déterminez si ArDate, Date, Calendar, long est le jour spécifié.
Référence Java à comprendre dans la figure
Étude de Java 8 (API de date dans le package java.time)
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
Implémenter l'algorithme dans Ruby: Jour 1 - Division mutuelle euclidienne-
J'ai essayé le nouveau yuan à Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Organisation des notes dans la tête (Java-Arrangement)
Essayez d'appeler le service CORBA sur Java 11+
[Java] Comment régler la date sur 00:00:00
Date de sortie en Java au format étendu ISO 8601
[Java] Comment obtenir le répertoire actuel
[jour: 5] J'ai résumé les bases de Java
Quelle est la méthode principale en Java?
Supprime après le caractère spécifié de la chaîne de caractères
Obtenir l'historique du serveur Zabbix en Java
L'histoire de l'écriture de Java dans Emacs
Entrée de la console en Java (comprendre le mécanisme)