Java 获取特定月份的工作天数

Java 获取特定月份的工作天数,java,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

我想得到一个月的工作天数

就我而言,周末是星期五和星期六

我使用以下代码:

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;
    }

}
import java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.Calendar;
导入java.util.Date;
导入java.util.GregorianCalendar;
公共类测试工作日{
/**
*@param args
*@ParseException
*/
公共静态void main(字符串[]args)引发异常{
//TODO自动生成的方法存根
SimpleDataFormat sdf=新的SimpleDataFormat(“dd-MM-yyyy”);
字符串dateInString=“01-07-2016”;
datestartdate=sdf.parse(dateInString);
字符串dateInString2=“31-07-2016”;
Date endDate=sdf.parse(dateInString2);
计算(开始日期、结束日期);
}
公共静态整数计算(日期开始日期、日期结束日期)
{
Calendar startCal=Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal=Calendar.getInstance();
endCal.设置时间(endDate);
国际工作日=0;
if(startCal.getTimeInMillis()>endCal.getTimeInMillis())
{
startCal.setTime(结束日期);
端校准设定时间(起始日期);
}
做
{
startCal.add(日历日/月,1);
if(startCal.get(Calendar.DAY/u-OF-u-WEEK)!=Calendar.周五和startCal.get(Calendar.DAY/u-OF-WEEK)!=Calendar.周六)
{
工作日++;
}
}

while(startCal.getTimeInMillis()我认为您的问题可能是由边界条件引起的,该边界条件导致在评估之前每个月增加一天。在增加实际天数之前,请先尝试执行星期几检查

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);
}

while(startCal.getTimeInMillis()替换使用这段代码,只需运行循环,直到条件
startCal after endCal
返回false

while(!startCal.after(endCal)) {
      if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
        workDays++;
      }
      startCal.add(Calendar.DATE, 1);
  }

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

System.out.printf("%s  %d%n", new SimpleDateFormat("yyyy-MM-dd EEE").format(startCal.getTime()), workDays);
顺便说一句:这叫做调试

输出

2016-07-02周六0
2016-07-03星期一
2016-07-04周一2
2016-07-05星期二3
2016-07-06星期三4
2016-07-07星期四5
2016-07-08星期五5
2016-07-09周六5
2016-07-10星期六
2016-07-11周一7
2016-07-12星期二8
2016-07-13星期三9
2016-07-14周四10
2016-07-15星期五10
2016-07-16周六10
2016-07-17星期日11
2016-07-18周一12
2016-07-19星期二13
2016-07-20星期三14
2016-07-21周四15
2016-07-22星期五15
2016-07-23周六15
2016-07-24星期日16
2016-07-25星期一17
2016-07-26星期二18
2016-07-27星期三19
2016-07-28星期四20
2016-07-29星期五20
2016-07-30周六20
2016-07-31星期日21
2016-08-01周一22
22
如您所见,您有两个问题:

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

我将留给您来找出解决方案。祝您好运。

请查看您使用
Date
Calendar
,而不是java 8 time API,是否有特定的原因?您的代码解决了问题,但您的描述有误导性,至少在我的阅读方式上是如此。它没有从
Do{}while()
while(){}
解决了问题,它正在移动
add()
调用循环的末尾来执行此操作。换句话说,它不是循环检查必须在增量之前,而是星期几检查必须在增量之前。@Andreas是的,我在您的评论之前就意识到了这一点,我现在将更新。一如既往地感谢您的支持。这不是唯一的问题,因为代码不检查也就是月的第一天。
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);
while(!startCal.after(endCal)) {
      if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
        workDays++;
      }
      startCal.add(Calendar.DATE, 1);
  }
System.out.printf("%s  %d%n", new SimpleDateFormat("yyyy-MM-dd EEE").format(startCal.getTime()), workDays);
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);