我正在寻找一种方法来计算Joda Time的营业日数。 我得到的总天数:
DateMidnight start = new DateMidnight(DateMidnight.now());
DateMidnight end = new DateMidnight(2014,10,10);
int days = Days.daysBetween(start,end).getDays();
然后我会减去周末/假日的数量。 但是我如何计算它们呢?
很乐意帮忙。
答案 0 :(得分:5)
今天必须弄清楚这一点,并不喜欢我在网上看到的任何答案。所以,对于遇到此问题的其他人来说,这是我的解决方案。请注意,我假设如果开始或结束是在周末,我会在下一个工作日(周六或周日成为下周一)。之后就像获取之间的天数一样简单,然后计算出之间的周末数,最后每个周末减去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;
}
}
我确定有人会过来评论说不是每个人都有同样的周末等等等等。我将区域设置差异作为练习对象:)
答案 1 :(得分:0)
DeezCashews的答案对我来说效果很好,可选择以下修改......
如果像我一样,您正在寻找日期之间的包容性差异,而不是日期之间的独家差异(例如,11月21日至11月25日星期五的员工假期请求应该在5天而不是4天出现,那么正确的方法是在调用“toWorkday()”方法之前在“结束”日期中添加一天。由于算法的实现方式,在此之后的任何时刻对差异进行测试都不起作用