JodaTime:两个日期之间的工作日数

时间:2013-02-01 14:49:35

标签: java jodatime

我正在寻找一种方法来计算Joda Time的营业日数。 我得到的总天数:

DateMidnight start = new DateMidnight(DateMidnight.now());
DateMidnight end =  new DateMidnight(2014,10,10);

int days = Days.daysBetween(start,end).getDays();

然后我会减去周末/假日的数量。 但是我如何计算它们呢?

很乐意帮忙。

2 个答案:

答案 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()”方法之前在“结束”日期中添加一天。由于算法的实现方式,在此之后的任何时刻对差异进行测试都不起作用