我们时常遇到这样的需求,几个工作日后干某件事情。
这里主要介绍在 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 等于需求变更的天数变量。