计算两个日历日期之间的工作日差异



我试图在两个日期之间找到工作日数(周末和时间必须忽略(。我正在使用以下功能来做到这一点。但是,它为多种条件提供了错误的结果,例如开头在周末或周末终点。这是演示的一个示例,该示例额外付出了一份。

2018-03-08 00:00:00.0和2018-04-22 01:37:29.887

返回32的计数(应为31,也正在考虑23-04-2018(。请提供一些完美的解决方案/方法。

private static int calculateDuration(Date startDate, Date endDate)
{
  Calendar startCal = Calendar.getInstance();
  startCal.setTime(startDate);
  startCal.set( Calendar.HOUR_OF_DAY, 0 );
  startCal.set( Calendar.MINUTE, 0 );
  startCal.set( Calendar.SECOND, 0 );
  startCal.set( Calendar.MILLISECOND, 0 );
  Calendar endCal = Calendar.getInstance();
  endCal.setTime(endDate);
  endCal.set( Calendar.HOUR_OF_DAY, 0 );
  endCal.set( Calendar.MINUTE, 0 );
  endCal.set( Calendar.SECOND, 0 );
  endCal.set( Calendar.MILLISECOND, 0 );
  int workDays = 0;
  if (startCal.getTimeInMillis() > endCal.getTimeInMillis())
  {
    startCal.setTime(endDate);
    endCal.setTime(startDate);
  }
  do
  {
    startCal.add(Calendar.DAY_OF_MONTH, 1);
    System.out.println("************"+Calendar.DAY_OF_WEEK);
    System.out.println("Before weekend condition"+Calendar.DAY_OF_WEEK+"Workdays="+workDays);
    if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)
    {
      workDays++;
        System.out.println("This day picked "+startCal.getTime()+"Workdays="+workDays);

    }
  }
  while (startCal.getTimeInMillis() <= endCal.getTimeInMillis());
System.out.println("Final workdays count for  "+startDate+" and "+endDate+" is"+workDays);
  return workDays;
}

我尝试了多种解决方案,但是除了提到方案外,这效果很好。

i 高度建议使用Java 9和更高版本中的java.time.LocalDate::datesUntil方法。它只需要几行即可计算,而不必使用Calendar

var startDate = LocalDate.parse("2018-03-08");
var endDate = LocalDate.parse("2018-04-22");
var numWeekDays = startDate.datesUntil(endDate)
                           .map(LocalDate::getDayOfWeek)
                           .filter(d -> d != DayOfWeek.SATURDAY && d != DayOfWeek.SUNDAY)
                           .count();
System.out.println(numWeekDays);

输出:

32

最新更新