获取特定月份的工作日数

时间:2016-07-18 06:30:27

标签: java

我想获得特定月份的工作天数

就我而言,周末的日子是星期五星期六

我使用此代码:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TestWeekDay {

    /**
     * @param args
     * @throws ParseException 
     */
    public static void main(String[] args) throws ParseException {

        // TODO Auto-generated method stub


        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        String dateInString = "01-07-2016";
        Date startDate = sdf.parse(dateInString);
        String dateInString2 = "31-07-2016";
        Date endDate = sdf.parse(dateInString2);
        calculateDuration(startDate,endDate);

    }



    public static int calculateDuration(Date startDate, Date endDate)
    {
      Calendar startCal = Calendar.getInstance();
      startCal.setTime(startDate);

      Calendar endCal = Calendar.getInstance();
      endCal.setTime(endDate);

      int workDays = 0;

      if (startCal.getTimeInMillis() > endCal.getTimeInMillis())
      {
        startCal.setTime(endDate);
        endCal.setTime(startDate);
      }

      do
      {
        startCal.add(Calendar.DAY_OF_MONTH, 1);
        if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY)
        {
          workDays++;
        }
      }
      while (startCal.getTimeInMillis() <= endCal.getTimeInMillis());

      return workDays;
    }

}

当我测试7月份的例子时,我 22 ,正确的答案应 21

5 个答案:

答案 0 :(得分:3)

如果在if语句后添加以下行,您将看到问题。

System.out.printf("%s  %d%n", new SimpleDateFormat("yyyy-MM-dd EEE").format(startCal.getTime()), workDays);

BTW:这叫做调试

输出

2016-07-02 Sat  0
2016-07-03 Sun  1
2016-07-04 Mon  2
2016-07-05 Tue  3
2016-07-06 Wed  4
2016-07-07 Thu  5
2016-07-08 Fri  5
2016-07-09 Sat  5
2016-07-10 Sun  6
2016-07-11 Mon  7
2016-07-12 Tue  8
2016-07-13 Wed  9
2016-07-14 Thu  10
2016-07-15 Fri  10
2016-07-16 Sat  10
2016-07-17 Sun  11
2016-07-18 Mon  12
2016-07-19 Tue  13
2016-07-20 Wed  14
2016-07-21 Thu  15
2016-07-22 Fri  15
2016-07-23 Sat  15
2016-07-24 Sun  16
2016-07-25 Mon  17
2016-07-26 Tue  18
2016-07-27 Wed  19
2016-07-28 Thu  20
2016-07-29 Fri  20
2016-07-30 Sat  20
2016-07-31 Sun  21
2016-08-01 Mon  22
22

如您所见,您有两个问题:

  • 未检查当月的第一天(2016-07-01)
  • 检查下个月的第一天(2016-08-01)

我会留给你找出解决方案。祝你好运。

答案 1 :(得分:1)

我认为您的问题可能是由边界条件引起的,这导致在评估之前每个月添加一天。在增加实际日期之前,请尝试一周检查第一个

while (startCal.getTimeInMillis() <= endCal.getTimeInMillis()) {
    if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY &&
        startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {

        workDays++;
    }

    startCal.add(Calendar.DAY_OF_MONTH, 1);
}

答案 2 :(得分:1)

Calendar cal = Calendar.getInstance();
/* set the 1st date of ongoing month */
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 1, 0, 0, 1);
Calendar cal1 = Calendar.getInstance();
/* set the last date of ongoing month */
cal1.set(cal1.get(Calendar.YEAR), cal1.get(Calendar.MONTH), cal1.getMaximum(Calendar.DAY_OF_MONTH), 23, 59, 59);
int workingDays = 0;
/* run the while loop until the months are same */
while (cal.get(Calendar.MONTH) != cal1.get(Calendar.MONTH)) {
      if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY
           && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                System.out.println("Check >> "+ cal.getTime());
                workingDays++;
      }
      cal.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(workingDays);

答案 3 :(得分:0)

使用这段代码,只需运行循环,直到条件jQuery(document).ready(function(){ alert(jQuery('#saveForm #rname').attr('id')); }); 返回false。

startCal after endCal

答案 4 :(得分:-1)

将您的while条件中的&lt; =替换为&lt;如下所示 -

while (startCal.getTimeInMillis() < endCal.getTimeInMillis());

这会产生问题,因为对于该月的最后一天,您的条件(最初使用&lt; =)返回true,因为最终在将startCal递增1天后,它变为等于某一点的endCal。由于变得相等,您的以下行将在do

中执行
startCal.add(Calendar.DAY_OF_MONTH, 1);

因此下一个日期是四月一日,即星期一。因此,这也会被添加到工作日列表中。

注意 - 请按照@Andreas评论调试您的代码。通过一些调试,您可以轻松找到问题。再次调试代码对开发人员来说非常重要。 你不能忽视它!

正如@Andreas正确指出的那样,这个月的第一天也不会受到检查。为了检查第一天,您需要先比较第一天,然后将第一天增加1.以下是代码 -

 do
   {
      if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY &&   startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY)
      {
          workDays++;
      }
      startCal.add(Calendar.DAY_OF_MONTH, 1); //Moved this line to last of do block
   }
   while (startCal.getTimeInMillis() < endCal.getTimeInMillis());