6

私はオラクルにテーブルを持っており、メキシコで12の公開日を保存しました。登録してから、制限日を計算する必要があります。

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'を追加して、すべての休日を一覧表示することをお勧めします。これは、データベースに複数回アクセスして休日を確認するよりも、12の日付をメモリに保存する方が効率的だからです。

データベースメソッドを変更/追加できない場合は、これを行うことができます

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」日付を設定できると仮定しました。ただし、この方法では、データベースを少なくとも3回呼び出すことになり、非効率的です。

于 2013-03-25T22:36:31.133 に答える