1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
   | public enum PeriodeDeTravail {
 
	MATIN,
	APRES_MIDI,
	NUIT,
	REPOS;
 
	public static class Roulement {
		private PeriodeDeTravail[] periods;
		public Roulement(PeriodeDeTravail period, PeriodeDeTravail...periods) {
			this.periods=new PeriodeDeTravail[periods.length+1];
			this.periods[0]=Objects.requireNonNull(period);
			for(int i=0; i<periods.length; i++) {
				this.periods[i+1]=Objects.requireNonNull(periods[i]);
			}
		}
		private PeriodeDeTravail get(int decalage) {
			return periods[decalage%periods.length];
		}
		public PeriodeDeTravail of(LocalDate debut, LocalDate date) {
			if(  date.isAfter(debut) || date.equals(debut) ) {
				return get(Period.between(debut, date).getDays());
			}
			else {
				throw new IllegalArgumentException();
			}
		}
	}
 
	public static void main(String[] args) {
 
		 Roulement roulement = new Roulement(PeriodeDeTravail.MATIN,
				 PeriodeDeTravail.MATIN,
				 PeriodeDeTravail.APRES_MIDI,
				 PeriodeDeTravail.APRES_MIDI,
				 PeriodeDeTravail.NUIT,
				 PeriodeDeTravail.NUIT,
				 PeriodeDeTravail.REPOS,
				 PeriodeDeTravail.REPOS,
				 PeriodeDeTravail.REPOS);
 
		 // Démo-test
		 LocalDate now = LocalDate.now();
 
		 for(int i=0; i< 20; i++ ) {
			 System.out.format("J+%d : %s%n",i,roulement.of(now, now.plusDays(i)));
		 }
		 System.out.println("--");
 
		 LocalDate debut = LocalDate.of(2015, Month.MARCH, 1);
		 LocalDate date = LocalDate.of(2016, Month.MAY, 16);
		 System.out.format("Période pour le %1$td %1$tb %1$tY pour un roulement commençant le %2$td %2$tb %2$tY : ", date, debut);
		 System.out.println(roulement.of(debut, date));
 
	}
 
} | 
Partager