我在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日是公共日,它不起作用,任何想法?
答案 0 :(得分:8)
几个问题:
您不会检查您跳过的前3天是否包含周末日。
此外,您正在跳过奇怪的天数并在工作日跳过(这是工作日,因此不应跳过)。
我假设方法DiaFestivoDTO.obtenerDiasFestivos()计算某个日期范围内的国定假日数,但是开始日期是多少?是否在创建DiaFestivoDTO时初始化为当前日期?
当您的日期范围内有国定假日时,您会增加日期范围,但从不检查此新日期范围是否包含新的国家法定假日或周末日。
如果您要做的是计算“从现在起3个工作日”的日期,这里大致是我要做的事情:
// get all the holidays as java.util.Date
DiaFestivoDTO dia = new DiaFestivoDTO();
List<Date> 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'。但是通过这种方式,你至少会调用数据库三次,效率很低。