2014-11-24 125 views
0

我需要製作一個應用程序來統計它一直有多少個工作日。例如是2014年9月23日。這是本月的第17個工作日。顯然它排除了週末。當這個月結束時,櫃檯將重新開始。所以,當日期是十月1日那麼計數器將等於1.用日期參數計算工作日

我已經有了這組代碼它今天的日期是11-24-14正確工作。輸出是17,這是正確的。但在其他日期這是錯誤的。我沒有進行一些驗證,例如週末檢查,因爲我正在測試邏輯。

這裏的代碼塊:

Date dateToday = new Date(); 
    Calendar cal = Calendar.getInstance(); 
    cal.setTime(dateToday); 
    int year = cal.get(Calendar.YEAR); 
    int month = cal.get(Calendar.MONTH); 
    int day = cal.get(Calendar.DAY_OF_WEEK); 

    int week = cal.get(Calendar.WEEK_OF_MONTH); 
    int dayNo=0; 


    System.out.println("year= " + year + " month= " + month + " day= " 
      + day + " week= " + week); 
    if ((day == Calendar.SATURDAY) && (day == Calendar.SUNDAY)) { 
     willPush = false; 
    }else{ 
     if(week>4){ 
      week-=1; 
     } 
     if(week==1){ 
      dayNo+=day-1; 
     }else if(week==2){ 
      dayNo=day+5; 
     }else if(week==3){ 
      dayNo=day+10; 
     }else if(week==4){ 
      dayNo=day+15; 
     }else if(week==5){ 
      dayNo=day+20; 
     } 
     dayNo-=1; 
    } 

    System.out.println("DayNO: "+dayNo); 

更新:只是想通了,這個邏輯是有缺陷的,非常有缺陷的。將嘗試一種新的方法,我正在考慮循環遍歷本月的日子,然後檢查它們是否是週末。不知道這是不是最好的主意。

+0

你不能這樣做,沒有理由的第一週是5個工作日長(並且它打破了你所有的邏輯) – yunandtidus 2014-11-24 08:40:33

+0

是的。在發佈此信息後發現這一點。我一直在嘗試一些新的邏輯 – 2014-11-24 08:43:54

+0

如果你選擇接受它,你的任務是構建一個算法,計算O(1)中的這個。提示:您的範圍將包括(i)開始存根,(ii)整數週數,(iii)末端存根。對於(i)和(iii)計算週末天數,因爲(ii)工作日是總天數* 5/7。這就是我在生產中的做法(爲具有不同週末定義的場所提供津貼)。當前的答案很糟糕,因爲它們是O(N)。 – Bathsheba 2014-11-24 09:23:39

回答

1

以下是示例代碼。使用joda庫。

import org.joda.time.DateTimeConstants; 
import org.joda.time.LocalDate; 

public class WeekDays { 
    public static void main(String[] args) { 
     final LocalDate start = new LocalDate(2014, 1, 1); 
     final LocalDate end = new LocalDate(2014, 1, 14); 

     LocalDate weekday = start; 

     if (start.getDayOfWeek() == DateTimeConstants.SATURDAY || 
       start.getDayOfWeek() == DateTimeConstants.SUNDAY) { 
      weekday = weekday.plusWeeks(1).withDayOfWeek(DateTimeConstants.MONDAY); 
     } 

     int weekdayCount = 1; 
     while (weekday.isBefore(end)) { 
      weekdayCount++; 
      System.out.println(weekday); 

      if (weekday.getDayOfWeek() == DateTimeConstants.FRIDAY) 
       weekday = weekday.plusDays(3); 
      else 
       weekday = weekday.plusDays(1); 
     } 

     System.out.println(weekdayCount); 
    } 
} 
1

這裏是我會做這樣的方式:

public class Main { 

    public static void main(String[] args) { 
     Calendar c = Calendar.getInstance(); 
     c.set(2014, 0, 3, 0, 0); 
     new Main().computeNbDays(c); 
    } 

    private void computeNbDays(Calendar cal) { 
     int day = cal.get(Calendar.DAY_OF_MONTH); 
     System.out.println("day = " + day); 

     int nbDays = 0; 
     for (int i = 1; i <= day; i++) { 
      cal.set(Calendar.DAY_OF_MONTH, i); 
      if (workedDay(cal)) { 
       nbDays++; 
      } 
     } 

     System.out.println(nbDays); 
    } 

    private boolean workedDay(Calendar c) { 
     if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { 
      return false; 
     } 
     if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { 
      return false; 
     } 

     return !holidays.contains(c); 
    } 

    List<Calendar> holidays = Arrays.asList(
      newCalendar(2014, 0, 1), // NEW YEAR 
      newCalendar(2014, 11, 25) // XMAS 
     ); 

    private static final Calendar newCalendar(int year, int month, int day) { 
     Calendar c = Calendar.getInstance(); 
     c.set(year, month, day, 0, 0); 
     return c; 
    } 
} 

目的是循環從1天到天X,看看它是否是工作日,而不是一個節日。您需要自定義您的假期列表。