Java 增加工作日天数-跳过周末

我们时常遇到这样的需求,几个工作日后干某件事情。

这里主要介绍在 Java 8 中向 LocalDate 实例添加天数时跳过周末的算法。

添加天数

该方法中,我们陆续向 LocalDate 对象中添加一天,直到我们添加了所需的天数。在添加一天时,我们检查新 LocalDate 实例的日期是星期六还是星期日。

如果检查返回true,那么我们不会为在该点之前添加的天数增加计数器。但是,如果当前日期是工作日,那么我们增加计数器。

这样,我们继续添加天数,直到计数器等于应该添加的天数:

public static LocalDate addDaysSkippingWeekends(LocalDate date, int days) {
    LocalDate result = date;
    int addedDays = 0;
    while (addedDays < days) {
        result = result.plusDays(1);
        if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
            ++addedDays;
        }
    }
    return result;
}

在上面的代码中,我们使用LocalDate对象的 plusDays() 方法将天数添加到结果对象中。仅当这一天是工作日时,我们才增加 addedDays 变量。当变量 addedDays 等于 days 变量时,停止向结果 LocalDate 对象添加天数。

减去天数

同样,我们可以使用minusDays()方法从LocalDate对象中减去天数,直到我们减去所需的天数。

为了实现这一点,我们将保留一个计数器来记录减去的天数,该计数器仅在结果天是工作日时才增加:

public static LocalDate subtractDaysSkippingWeekends(LocalDate date, int days) {
    LocalDate result = date;
    int subtractedDays = 0;
    while (subtractedDays < days) {
        result = result.minusDays(1);
        if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
            ++subtractedDays;
        }
    }
    return result;
}

从上面的实现中,subtractedDays 只有在结果 LocalDate 对象是工作日时才会增加。使用 while 循环减去天数,直到subtractedDays 等于需求变更的天数变量。

标签: