如何将工作日添加到 Java 中的当前日期?
public Calendar addBusinessDate(Calendar cal, int days) {
//
// code goes over here
//
}
笔记:
它也应该考虑周末。
原文由 Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何将工作日添加到 Java 中的当前日期?
public Calendar addBusinessDate(Calendar cal, int days) {
//
// code goes over here
//
}
它也应该考虑周末。
原文由 Anand 发布,翻译遵循 CC BY-SA 4.0 许可协议
利用:
public Calendar addBusinessDate(Calendar cal, int numBusinessDays) {
int numNonBusinessDays = 0;
for(int i = 0; i < numBusinessDays; i++) {
cal.add(Calendar.DATE, 1);
/*
It's a Canadian/American custom to get the Monday (sometimes Friday) off
when a holiday falls on a weekend.
*/
for(int j = 0; j < holidays; j++) { //holidays is list of dates
if(cal.getTime() == (Date)holidays.get(j)) {
numNonBusinessDays++;
}
}
if(cal.get(Calendar.DAY_OF_WEEK) == 1 ||
cal.get(Calendar.DAY_OF_WEEK) == 7) {
numNonBusinessDays++;
}
}
if(numNonBusinessDays > 0) {
cal.add(Calendar.DATE, numNonBusinessDays);
}
return cal;
}
您必须填充日期列表才能处理假期。有像新年这样的常见节日,但例如加拿大和美国的感恩节就不同。还要注意假期可以在周末,所以周末变成了 3 天的周末。
参考:
PS:如果您像示例中那样更新值,则实际上不需要返回 Calendar 实例。但如果你想创建一个单独的 Calendar 实例,它是有效的,使用:
public Calendar addBusinessDate(Calendar cal, int numBusinessDays) {
Calendar cal2 = Calendar.getInstance();
cal2.setTime(cal.getTime());
int numNonBusinessDays = 0;
for(int i = 0; i < numBusinessDays; i++) {
cal2.add(Calendar.DATE, 1);
/*
It's a Canadian/American custom to get the Monday (sometimes Friday) off
when a holiday falls on a weekend.
*/
for(int j = 0; j < holidays; j++) { //holidays is list of dates
if(cal2.getTime() == (Date)holidays.get(j)) {
numNonBusinessDays++;
}
}
if(cal2.get(Calendar.DAY_OF_WEEK) == 1 ||
cal2.get(Calendar.DAY_OF_WEEK) == 7) {
numNonBusinessDays++;
}
}
if(numNonBusinessDays > 0) {
cal2.add(Calendar.DATE, numNonBusinessDays);
}
return cal2;
}
原文由 OMG Ponies 发布,翻译遵循 CC BY-SA 2.5 许可协议
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
3 回答1.6k 阅读✓ 已解决
您可能需要考虑使用 ObjectLab 套件 来为您完成繁重的工作。
假设要求只是在计算日期为非工作日时返回下一个工作日:
图书馆默认工作周为周一至周五,但您可以通过提供自定义
WorkingWeek
到DateCalculator
的setWorkingWeek()
.如最后两个示例所示,
moveByDays()
在移动日期时包括周末,而moveByBusinessDays()
不包括周末。该库还允许您使用
java.util.Calendar
或 Joda Time 的LocalDate
。这些示例使用 JDK8 的java.time.LocalDate
因为它是自 JDK8 以来的首选方式。编辑:更新示例以使用
java.time.LocalDate