在没有星期六,星期日和公众假期的情况下计算java的工作日

我在oracle有一张桌子,我在墨西哥保存了十二个公共日,我需要计算自你注册后的限制日

public Date calcularFechaLimite() { try { DiaFestivoDTO dia = new DiaFestivoDTO(); // Calendar fechaActual = Calendar.getInstance(); Calendar fechaL = Calendar.getInstance(); fechaL.add(Calendar.DATE, 3); switch (fechaL.get(Calendar.DAY_OF_WEEK)) { case Calendar.SATURDAY: fechaL.add(Calendar.DATE, 2); break; case Calendar.SUNDAY: fechaL.add(Calendar.DATE, 2); break; case Calendar.MONDAY: fechaL.add(Calendar.DATE, 2); break; case Calendar.TUESDAY: fechaL.add(Calendar.DATE, 1); default: break; } dia.setFechaLimite(fechaL.getTime()); Integer numeroDiasFest = seleccionPagoBO.obtenerDiasFestivos(dia); if (numeroDiasFest != 0) { fechaL.add(Calendar.DATE, numeroDiasFest); dia.setFechaLimite(fechaL.getTime()); } fechaLimite = fechaL.getTime(); } catch (Exception e) { e.printStackTrace(); } return fechaLimite; } 

这是我有,但3月28日和29日是公共日,它不工作,任何想法?

几个问题:

您没有检查您跳过的前3天是否包含周末日。

此外,您正在跳过奇怪的天数并在工作日跳过(这是工作日,因此不应跳过)。

我假设方法DiaFestivoDTO.obtenerDiasFestivos()计算某个日期范围内的国定假日数,但开始日期是多少? 是否在创建DiaFestivoDTO时初始化为当前日期?

当您的日期范围内有国定假日时,您会增加日期范围,但从不检查此新日期范围是否包括新的国家法定假日或周末日。

如果您要做的是计算“从现在起3个工作日”的日期,这里大致是我要做的:

 // get all the holidays as java.util.Date DiaFestivoDTO dia = new DiaFestivoDTO(); List holidays = dia.getAllNationalHolidays(); // get the current date without the hours, minutes, seconds and millis Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); // iterate over the dates from now and check if each day is a business day int businessDayCounter = 0 while (businessDayCounter < 3) { int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); if (dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY && !holidays.contains(cal.getTime())) { businessDayCounter++; } cal.add(Calendar.DAY_OF_YEAR, 1); } Date threeBusinessDaysFromNow = cal.getTime(); 

为了实现这个目的,我建议你添加一个新方法'getAllNationalHolidays'来列出假期,因为在内存中存储十二个日期比多次访问数据库以检查它们更有效。

如果您无法更改/添加数据库方法,那么您可以执行此操作

 while (businessDayCounter < 3) { // determine if this day is a holiday DiaFestivoDTO dia = new DiaFestivoDTO(); dia.setFechaInitial(cal.getTime()); dia.setFechaLimite(cal.getTime()); boolean isHoliday = seleccionPagoBO.obtenerDiasFestivos(dia) > 0; int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); if (dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY && !isHoliday) { businessDayCounter++; } cal.add(Calendar.DAY_OF_YEAR, 1); } 

在这里,我假设您可以使用'setFechaInitial'或类似的东西在DiaFestivoDTO中设置'from'日期。 但是通过这种方式,您将至少调用三次数据库效率低下。