7

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

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

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

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

会很高兴得到帮助。

4

3 回答 3

7

今天不得不弄清楚这一点,并且不喜欢我在网上看到的任何答案。因此,对于遇到此问题的其他人,这是我的解决方案。请注意,我假设如果开始或结束是在周末,我会在下一个工作日(周六或周日变为下周一)。之后,它就像获取之间的天数一样简单,然后计算出之间的周末数,最后每个周末减去 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;
  }
}

我相信有人会过来评论说,不是每个人都有相同的周末等等等等。我将语言环境差异作为练习留给那些这样做的人:)

于 2016-11-23T21:25:48.487 回答
1
于 2018-09-14T22:06:14.963 回答
0

DeezCashews 的答案对我来说效果很好,有以下可选修改......

如果像我一样,您正在寻找日期之间的包含差异而不是日期之间的唯一差异(例如,从 11 月 21 日星期一到 11 月 25 日星期五的员工假期请求应该在 5 天而不是 4 天出现),那么正确的方法就是在调用“toWorkday()”方法之前,在“结束”日期上加一天。由于算法的实现方式,在此之后的任何时候增加差异都不起作用

于 2016-11-29T10:37:16.977 回答