2016-04-06 12 views
1

私は現在HR systemで働いており、離脱管理モジュールには休暇の選択肢がget 10 consecutive days (working days except weekends)です。そのJ2EEアプリケーションです。与えられた日付から連続した平日の数字をNとします

私が欲しいのはget 'N' number of consecutive weekdays from the given date

にある誰もがこの問題を達成する方法を知っていますか?

P.S:私はJodaTimeのような任意のサードパーティのライブラリを使用していないよ...

ここでは、一日の休暇申請のための私のコントローラのコードがあります。それは連続した日とは関係ありません。しかし、ここではこれを掲示することで、(つまりJavaScriptを使用してタグ付けされた)標準のJavaでのソリューションを必要とするかどうかを

if (action.equals("applyLeave")) { 

    Leave l = new Leave(); 

    int userid = Integer.parseInt(request.getParameter("userid")); 
    int leavetype = Integer.parseInt(request.getParameter("leavetype")); 
    String from = request.getParameter("from"); // from time 
    String to = request.getParameter("to"); // to time 
    double total = Double.parseDouble(request.getParameter("total")); // total hours 

    String r1 = request.getParameter("rep1"); 
    String r2 = request.getParameter("rep2"); 

    if (r1 == null || r1.isEmpty()) { 
     r1 = "0"; 
    } 

    if (r2 == null || r2.isEmpty()) { 
     r2 = "0"; 
    } 

    int rep1 = Integer.parseInt(r1); 
    int rep2 = Integer.parseInt(r2); 

    String reason = request.getParameter("reason"); 
    String date = request.getParameter("date"); 

    l.setUser(userid); 
    l.setLeavetype(leavetype); 
    l.setDate(date); 
    l.setFrom(from); 
    l.setReason(reason); 
    l.setRep1(rep1); 
    l.setRep2(rep2); 
    l.setTo(to); 
    l.setTotal(total); 

    dao.saveLeave(l); 

    // get manager of the department 
    UserDao udao = (UserDao) ctx.getBean("udao"); 
    DepartmentDao ddao = (DepartmentDao) ctx.getBean("depdao"); 
    NotificationDao notificationDao = (NotificationDao) ctx.getBean("notificationDao"); 
    User u = udao.getUserByUserID(userid).get(0); 
    int department = u.getDepartment(); 
    Department d = ddao.getDepartmentByID(department).get(0); 
    int manager = d.getManager(); 

    // save a notification for the respective manager 
    // insert notification 
    String text = u.getFirstname() + " " + u.getLastname() + " has applied for a leave"; 
    Notification n = new Notification(); 
    n.setUserid(manager); 
    n.setFk(dao.getLeaveID()); 
    n.setType(3); 
    n.setText(text); 
    notificationDao.saveNotification(n); 

    PrintWriter out = res.getWriter(); 
    res.setContentType("text/html"); 
    Gson gson = new Gson(); 
    JsonObject myObj = new JsonObject(); 
    myObj.add("message", gson.toJsonTree("Successfully Inserted")); 
    out.println(myObj.toString()); 
    out.close(); 

} 
+0

@Psioniax、私は、アプリケーションで物事のほとんどを完了しましたが、私は、この日連続で取得するために苦労しています。私は解決のためにgoogleを探しましたが、何も見つかりませんでした。 –

+0

コードを編集して –

+0

@ Psioniax、コード –

答えて

1
List<Date> holidays = conf.getHolidays(); 
List<Date> nWorkingDays = new ArrayList<>(); 

// 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 < n) { //You want n working days 
    int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); 
    if (dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY && !holidays.contains(cal.getTime())) { 
     businessDayCounter++; 
     nWorkingDays.add(cal.getTime()); 
    } 
    cal.add(Calendar.DAY_OF_YEAR, 1); 
} 

return nWorkingDays; 

https://stackoverflow.com/a/15626124/1364747

+0

それは働いた。ありがとうございました ! –

1

わからない..私は深刻な何かをやっていることを証明するが、私は次のようにあなたがそれを行うことができると思いますします

int numberOfDays = 10; 

// Get current date 
Calendar calendar = Calendar.getInstance(); 

//Repeat until all consecutive weekdays consumed 
while(numberOfDays >0) { 
    int day = calendar.get(Calendar.DAY_OF_WEEK); 

    if((day != Calendar.SUNDAY) && (DAY != Calendar.SATURDAY)) { 
     numberOfDays--; 
    } 

    calendar.add(Calendar.DAY,1); 
} 

// Calendar now contains the date after consuming all 
// consecutive week days 
return calendar; 

WARNING:がコンパイルされたり、例外が発生する場合がありますので、この例を実行していません。この回答から適応