Skip to content

Instantly share code, notes, and snippets.

@SalcedoEsteban
Forked from marlonramirez/HolidayUtil.java
Created July 26, 2020 21:31
Show Gist options
  • Save SalcedoEsteban/eff388b40190c89a17d96a1980e90eb2 to your computer and use it in GitHub Desktop.
Save SalcedoEsteban/eff388b40190c89a17d96a1980e90eb2 to your computer and use it in GitHub Desktop.
Gestión de fechas en colombia, días habiles, festivos, etc.
package com.mes.modules.milanes.utilities;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class DateUtil {
private int year;
private int easterMonth;
private int easterDay;
private ArrayList<String> holidays;
public DateUtility(int year) {
this.year = year;
this.holidays = new ArrayList<String>();
int a = year % 19;
int b = year / 100;
int c = year % 100;
int d = b / 4;
int e = b % 4;
int g = (8 * b + 13) / 25;
int h = (19 * a + b - d - g + 15) % 30;
int j = c / 4;
int k = c % 4;
int m = (a + 11 * h) / 319;
int r = (2 * e + 2 * j - k - h + m + 32) % 7;
this.easterMonth = (h - m + r + 90) / 25;
this.easterDay = (h - m + r + this.easterMonth + 19) % 32;
this.easterMonth--;
this.holidays.add("0:1");// Primero de Enero
this.holidays.add("4:1");// Dia del trabajo 1 de mayo
this.holidays.add("6:20");//Independencia 20 de Julio
this.holidays.add("7:7");//Batalla de boyaca 7 de agosto
this.holidays.add("11:8");//Maria inmaculada 8 de diciembre
this.holidays.add("11:25");//Navidad 25 de diciembre
System.out.println(this.easterDay);
this.calculateEmiliani(0, 6);// Reyes magos 6 de enero
this.calculateEmiliani(2, 19);//San jose 19 de marzo
this.calculateEmiliani(5, 29);//San pedro y san pablo 29 de junio
this.calculateEmiliani(7, 15);//Asuncion 15 de agosto
this.calculateEmiliani(9, 12);//Descubrimiento de america 12 de octubre
this.calculateEmiliani(10, 1);//Todos los santos 1 de noviembre
this.calculateEmiliani(10, 11);//Independencia de cartagena 11 de noviembre
this.calculateOtherHoliday(-3, false);//jueves santos
this.calculateOtherHoliday(-2, false);//viernes santo
this.calculateOtherHoliday(40, true);//Asención del señor de pascua
this.calculateOtherHoliday(60, true);//Corpus cristi
this.calculateOtherHoliday(68, true);//Sagrado corazon
}
private void calculateEmiliani(int month, int day) {
Calendar date = Calendar.getInstance();
date.set(this.year, month, day);
int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);
switch (dayOfWeek) {
case 1:
date.add(Calendar.DATE, 1);
break;
case 3:
date.add(Calendar.DATE, 6);
break;
case 4:
date.add(Calendar.DATE, 5);
break;
case 5:
date.add(Calendar.DATE, 4);
break;
case 6:
date.add(Calendar.DATE, 3);
break;
case 7:
date.add(Calendar.DATE, 2);
break;
}
this.holidays.add(date.get(Calendar.MONTH) + ":" + date.get(Calendar.DATE));
}
private void calculateOtherHoliday(int days, boolean emiliani) {
Calendar date = Calendar.getInstance();
date.set(this.year, this.easterMonth, this.easterDay);
date.add(Calendar.DATE, days);
if (emiliani) {
this.calculateEmiliani(date.get(Calendar.MONTH), date.get(Calendar.DATE));
} else {
this.holidays.add(date.get(Calendar.MONTH) + ":" + date.get(Calendar.DATE));
}
}
public boolean isHoliday(int month, int day) {
return this.holidays.contains(month + ":" +day);
}
public int getYear() {
return year;
}
public static Date getNextDayEnabled(Date date, int days) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
DateUtility dateUtil = new DateUtility(calendar.get(Calendar.YEAR));
while(days > 0) {
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek != 1 && dayOfWeek != 7 && !dateUtil.isHoliday(calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE))) {
days--;
}
calendar.add(Calendar.DATE, 1);
}
return calendar.getTime();
}
public static int getCountEnabedDays(Date dateInit, Date dateEnd){
Calendar limitDay = Calendar.getInstance();
int days = 0;
if (dateEnd != null) {
limitDay.setTime(dateEnd);
}
Calendar startDay = Calendar.getInstance();
startDay.setTime(dateInit);
DateUtil dateUtil = new DateUtil(startDay.get(Calendar.YEAR));
while(startDay.getTime().getTime() <= limitDay.getTime().getTime()) {
int dayOfWeek = startDay.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek != 1 && dayOfWeek != 7 && !dateUtil.isHoliday(startDay.get(Calendar.MONTH), startDay.get(Calendar.DATE))) {
days++;
}
startDay.add(Calendar.DATE, 1);
}
if (days == 0) {
return days;
}
return days - 1;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment