我正在寻找一种计算 Joda Time 工作日数的方法。我得到的总天数:
DateMidnight start = new DateMidnight(DateMidnight.now());
DateMidnight end = new DateMidnight(2014,10,10);
int days = Days.daysBetween(start,end).getDays();
然后我会减去周末/节假日的数量。但我如何计算它们?
会很高兴得到帮助。
今天不得不弄清楚这一点,并且不喜欢我在网上看到的任何答案。因此,对于遇到此问题的其他人,这是我的解决方案。请注意,我假设如果开始或结束是在周末,我会在下一个工作日(周六或周日变为下周一)。之后,它就像获取之间的天数一样简单,然后计算出之间的周末数,最后每个周末减去 2 天:
public class DateUtil {
public static final int DAYS_PER_WEEKEND = 2;
public static final int WEEK_START = DateTimeConstants.MONDAY;
public static final int WEEK_END = DateTimeConstants.FRIDAY;
public static int workdayDiff(Date d1, Date d2) {
LocalDate start = LocalDate.fromDateFields(d1);
LocalDate end = LocalDate.fromDateFields(d2);
start = toWorkday(start);
end = toWorkday(end);
int daysBetween = Days.daysBetween(start, end).getDays();
int weekendsBetween = Weeks.weeksBetween(start.withDayOfWeek(WEEK_START), end.withDayOfWeek(WEEK_START)).getWeeks();
return daysBetween - (weekendsBetween * DAYS_PER_WEEKEND);
}
public static LocalDate toWorkday(LocalDate d) {
if (d.getDayOfWeek() > WEEK_END) {
return d.plusDays(DateTimeConstants.DAYS_PER_WEEK - d.getDayOfWeek() + 1);
}
return d;
}
}
我相信有人会过来评论说,不是每个人都有相同的周末等等等等。我将语言环境差异作为练习留给那些这样做的人:)
DeezCashews 的答案对我来说效果很好,有以下可选修改......
如果像我一样,您正在寻找日期之间的包含差异而不是日期之间的唯一差异(例如,从 11 月 21 日星期一到 11 月 25 日星期五的员工假期请求应该在 5 天而不是 4 天出现),那么正确的方法就是在调用“toWorkday()”方法之前,在“结束”日期上加一天。由于算法的实现方式,在此之后的任何时候增加差异都不起作用