计算两个日历日期之间的工作日差异
Calculating workday difference between two calendar dates
我正在尝试查找两个日期之间的工作日计数(必须忽略周末和时间)。我正在使用以下功能来做到这一点。但它会针对多种情况给出错误的结果,例如开始日期是否在周末或结束日期是否在周末。这是一个演示示例,可以额外计算一天。
2018-03-08 00:00:00.0 and 2018-04-22 01:37:29.887
计数返回 32(应该是 31,它也在考虑 23-04-2018)。请提供一些完美的 solution/approach 来做同样的事情。
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;
}
我尝试了多种解决方案,但除了提到的情况外,这个效果很好。
我高度推荐使用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
我正在尝试查找两个日期之间的工作日计数(必须忽略周末和时间)。我正在使用以下功能来做到这一点。但它会针对多种情况给出错误的结果,例如开始日期是否在周末或结束日期是否在周末。这是一个演示示例,可以额外计算一天。
2018-03-08 00:00:00.0 and 2018-04-22 01:37:29.887
计数返回 32(应该是 31,它也在考虑 23-04-2018)。请提供一些完美的 solution/approach 来做同样的事情。
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;
}
我尝试了多种解决方案,但除了提到的情况外,这个效果很好。
我高度推荐使用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