2013-03-25 84 views
5

我在Oracle中,我在墨西哥的十二個公衆日保存一個表,我需要計算,因爲你註冊計算工作日在Java中沒有星期六,星期日及公衆假期

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

您只有3天后註冊。謝謝 – user2084446 2013-03-25 18:47:31

+0

當你在問題中標記時,你在這裏做了什麼樣的總結? – SRy 2013-03-25 21:19:12

回答

8

幾個問題:

您不檢查前三天是否包含週末日。

此外,您正在跳過奇怪的天數和平日跳過(這是工作日,因此不應該跳過)。

我假設方法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); 
} 

這裏我以爲你可以設定「從」日在DiaFestivoDTO使用「setFechaInitial」或類似的東西。但通過這種方式,您至少需要調用數據庫三次,這是效率低下的。

+0

謝謝你哦,我忘了我初始化今天的日期在Oracle中,這是我的查詢 – user2084446 2013-03-25 23:18:09

+0

SELECT COUNT(0) \t \t FROM \t \t \t DIA_FESTIVO WHERE – user2084446 2013-03-25 23:18:37

+0

(SYSDATE和#{} fechaLimite之間DF_T_FECHA)我要去嘗試與你的功能 – user2084446 2013-03-25 23:19:40

相關問題