6

我在 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 日是公共日,它不起作用,知道吗?

4

1 回答 1

10

几个问题:

您没有检查您跳过的前 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 中设置“开始”日期。但是通过这种方式,您将至少调用数据库 3 次,这是低效的。

于 2013-03-25T22:36:31.133 回答