calcular días hábiles incluyendo festivos

Necesito calcular los días hábiles entre dos fechas. Ej: tenemos vacaciones (en USA) el 4 de julio. así que si mis fechas son date1 = 07/03/2012 date2 = 07/06/2012

no de días hábiles entre semana, estas fechas deben ser 1, ya que el 4 de julio es feriado.

Tengo un método a continuación para calcular los días hábiles que solo contarán los fines de semana pero no los días festivos. ¿Hay alguna forma de calcular las vacaciones también … por favor ayudenme en esto?

public static int getWorkingDaysBetweenTwoDates(Date startDate, Date endDate) { Calendar startCal; Calendar endCal; startCal = Calendar.getInstance(); startCal.setTime(startDate); endCal = Calendar.getInstance(); endCal.setTime(endDate); int workDays = 0; //Return 0 if start and end are the same if (startCal.getTimeInMillis() == endCal.getTimeInMillis()) { return 0; } if (startCal.getTimeInMillis() > endCal.getTimeInMillis()) { startCal.setTime(endDate); endCal.setTime(startDate); } do { startCal.add(Calendar.DAY_OF_MONTH, 1); if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { ++workDays; } } while (startCal.getTimeInMillis() < endCal.getTimeInMillis()); return workDays; } 

Supongamos que tiene una lista que contiene todos los días festivos, como mencionó.

 ArrayList holidays = ... 

Simplemente agregue una condición a su condición if en su do-while :

 do { startCal.add(Calendar.DAY_OF_MONTH, 1); if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && !holidays.contains((Integer) startCal.get(Calendar.DAY_OF_YEAR))) { ++workDays; } } while (startCal.getTimeInMillis() < endCal.getTimeInMillis()); 

Por razones de simplicidad, he supuesto que holiday contiene fechas en el formato idéntico a Calendar.DAY_OF_YEAR .

Nager.Date

Puede usar la API JSON del proyecto Nager.Date . Es compatible con EE. UU., Canadá y Europa. Los datos disponibles para cada año pueden guardar la información en su propia base de datos.

Ejemplo

 //https://github.com/FasterXML/jackson-databind/ ObjectMapper mapper = new ObjectMapper(); MyValue value = mapper.readValue(new URL("http://date.nager.at/api/v1/get/US/2017"), PublicHoliday[].class); 

PublicHoliday.class

 public class PublicHoliday { public String Date; public String LocalName; public String Name; public String CountryCode; public Boolean Fixed; public Boolean CountyOfficialHoliday; public Boolean CountyAdministrationHoliday; public Boolean Global; public String[] Counties; public int LaunchYear; } 

Ejemplo de datos JSON recuperados.

 [ { "date": "2017-01-01", "localName": "New Year's Day", "name": "New Year's Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null }, { "date": "2017-01-16", "localName": "Martin Luther King, Jr. Day", "name": "Martin Luther King, Jr. Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null }, { "date": "2017-01-20", "localName": "Inauguration Day", "name": "Inauguration Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": false, "counties": [ "US-DC", "US-LA", "US-MD", "US-VA" ], "launchYear": null }, { "date": "2017-02-20", "localName": "Washington's Birthday", "name": "Presidents' Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null }, { "date": "2017-05-29", "localName": "Memorial Day", "name": "Memorial Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null }, { "date": "2017-07-04", "localName": "Independence Day", "name": "Independence Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null }, { "date": "2017-09-04", "localName": "Labor Day", "name": "Labor Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null }, { "date": "2017-09-09", "localName": "Columbus Day", "name": "Columbus Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": false, "counties": [ "US-AL", "US-AZ", "US-CO", "US-CT", "US-DC", "US-GA", "US-ID", "US-IL", "US-IN", "US-IA", "US-KS", "US-KY", "US-LA", "US-ME", "US-MD", "US-MA", "US-MS", "US-MO", "US-MT", "US-NE", "US-NH", "US-NJ", "US-NM", "US-NY", "US-NC", "US-OH", "US-OK", "US-PA", "US-RI", "US-SC", "US-TN", "US-UT", "US-VA", "US-WV" ], "launchYear": null }, { "date": "2017-11-10", "localName": "Veterans Day", "name": "Veterans Day", "countryCode": "US", "fixed": false, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null }, { "date": "2017-12-23", "localName": "Thanksgiving Day", "name": "Thanksgiving Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": 1863 }, { "date": "2017-12-25", "localName": "Christmas Day", "name": "Christmas Day", "countryCode": "US", "fixed": true, "countyOfficialHoliday": true, "countyAdministrationHoliday": true, "global": true, "counties": null, "launchYear": null } ] 

No tengo ningún ejemplo de código ni nada de eso, pero hice algo de búsqueda para ti y encontré este hilo de Stack Overflow que tiene algunos enlaces a servicios web que pueden devolverte fechas de vacaciones, lo que puede ayudarte a llegar a donde estás. necesita ser: servicio web de vacaciones nacional

La respuesta principal en ese hilo está vinculada a este servicio web: http://www.holidaywebservice.com/

No estoy seguro si usar un servicio web para este tipo de cosas es exagerado o no, pero seguramente hay una mejor manera. Me disculpo, no soy el progtwigdor más experimentado, así que no puedo ayudarte tanto como me gustaría.