Java 两个日期之间的差异,仅包括工作日(即不包括周末和节假日)

Java 两个日期之间的差异,仅包括工作日(即不包括周末和节假日),java,date,datediff,Java,Date,Datediff,如何获取两个java.util.Date之间的工作日数,即不包括周末和节假日?我指的是假期。这必须取决于国家,因为不同国家的假日不同 例如,2012-08-27-2012-08-24应该返回1,而不是3,因为中间有周末 我已经看过了,但是我不能让它们满足我的需要。我的意思是,它们都有很多有趣的方法,但找不到类似于getBusinessDaysCount(日期d1,日期d2)。这似乎是日期计算的常见问题。我经常对建议使用JodaTime感到不寒而栗,但它似乎是Java的事实日期API。如果你想有冒

如何获取两个
java.util.Date
之间的工作日数,即不包括周末和节假日?我指的是假期。这必须取决于国家,因为不同国家的假日不同

例如,
2012-08-27-2012-08-24
应该返回
1
,而不是
3
,因为中间有周末


我已经看过了,但是我不能让它们满足我的需要。我的意思是,它们都有很多有趣的方法,但找不到类似于
getBusinessDaysCount(日期d1,日期d2)

这似乎是日期计算的常见问题。我经常对建议使用
JodaTime
感到不寒而栗,但它似乎是Java的事实日期API。如果你想有冒险精神,实现一个基于年份的类是很简单的。所以我们知道在美国城,7月4日的《守则》遵守这些规定

“联邦法律(《美国法典》第5卷第6103节)为联邦雇员规定了以下公共假日。请注意,大多数联邦雇员在周一至周五工作。对于这些雇员,当假日在非工作日——周六或周日——通常在周一(如果假日在周日)或周五休假(如果假日在星期六)。”


因此,有了这些知识,您可以计算一周中的哪一天会有假期,并从两个范围之间的天数中减去该值。

最后,这里是一个基于
日历的解决方案
API:

/**
*按国家处理假期。
*/
公众假期{
/**
*看。
*/
法国{
@凌驾
受保护的无效添加固定假日(设置假日){
添加(新假日(日历1月1日));
添加(新假日(日历5月1日));
增加(新假日(日历5月8日));
添加(新假日(日历7月14日));
添加(新假日(日历8月15日));
假日。添加(新假日(日历11月1日));
添加(新假日(日历11月11日));
添加(新假日(日历12月25日));
}
@凌驾
受保护的无效添加可变假日(整数年,设置假日){
日期easterSunday=getEasterSunday(年);
添加(新假日(getEasterMonday(easterSunday));
假日。添加(新假日(GetAscensions周四(东周日));
假日。添加(新假日(getPentecostMonday(easterSunday));
}
},
/**
*看。
*/
英格兰{
@凌驾
受保护的无效添加固定假日(设置假日){
添加(新假日(日历1月1日));
添加(新假日(日历12月25日));
添加(新假日(日历12月26日));
}
@凌驾
受保护的无效添加可变假日(整数年,设置假日){
日期easterSunday=getEasterSunday(年);
假日。添加(新假日(getGoodFriday(easterSunday)));
添加(新假日(getEasterMonday(easterSunday));
添加(新假日(get(WeekdayIndex.FIRST,Calendar.MONDAY,Calendar.MAY,year));
添加(新假日(获取(WeekdayIndex.LAST,Calendar.MONDAY,Calendar.MAY,year));
添加(新假日(获取(WeekdayIndex.LAST,Calendar.MONDAY,Calendar.AUGUST,year));
假日圣诞节=新假日(日历12月25日);
如果(圣诞节.周末(年)){
添加(新假日(日历12月27日));
}
假日boxingDay=新假日(日历:12月26日);
如果(boxingDay.isWeekend(年)){
添加(新假日(日历12月28日));
}
}
};
公共类HolidayException扩展了异常{
私有静态最终长serialVersionUID=1L;
私人假期例外(字符串消息){
超级(信息);
}
}
/**
*假日由{@link Calendar#MONTH}和{@link Calendar#DAY#u OF_MONTH}定义。
*/
私人假期{
私人决赛日;
私人最后一个月;
公众假期(日期){
日历=Calendar.getInstance();
日历。设置时间(日期);
month=calendar.get(calendar.month);
day=calendar.get(calendar.day/u月);
}
公众假期(国际月、国际日){
本月=月;
this.day=天;
}
当前公开日期(整年){
日历=Calendar.getInstance();
日历集(年、月、日);
返回calendar.getTime();
}
公共周末(整年){
日历=Calendar.getInstance();
日历设置时间(今天(年));
int dayOfWeek=calendar.get(calendar.DAY/u周);
return dayOfWeek==Calendar.SATURDAY | | dayOfWeek==Calendar.SUNDAY;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj){
返回true;
}否则如果(!(obj假日实例)){
返回false;
}否则{
假日=(假日)obj;
返回holiday.month==月和假日.day==天;
}
}
@凌驾
公共int hashCode(){
返回Arrays.hashCode(新int[]{month,day});
}
}
/**
*与{@link Holidays#get(WeekdayIndex,int,int,int)}一起使用。
*
*示例:
Holidays.get(WeekdayIndex.FIRST,Calendar.MONDAY,Calendar.MAY,2000)
。 */ 公共枚举工作日索引{ 第一(1)、第二(2)、第三(3)、第四(4)、最后(空); 私有最终整数索引; 专用工作日索引(整数索引){ 这个指数=指数; } 私有布尔值为(整数计数){ 返回索引!=null&&index==count; } } 私有最终集fixedHolidays=新HashSet(); private final Map variableHolidays=new HashMap(); 私人假期{ 添加固定假日(固定假日); } 受保护的抽象空addFi