/** * Returns the date that falls on the specified day-of-the-week and is CLOSEST to the base date. * * @param targetDOW a code for the target day-of-the-week. * @param base the base date. * @return the date that falls on the specified day-of-the-week and is CLOSEST to the base date. */ public static SerialDate getNearestDayOfWeek(final int targetDOW, final SerialDate base) { // check arguments... if (!SerialDate.isValidWeekdayCode(targetDOW)) { throw new IllegalArgumentException("Invalid day-of-the-week code."); } // find the date... final int baseDOW = base.getDayOfWeek(); int adjust = -Math.abs(targetDOW - baseDOW); if (adjust >= 4) { adjust = 7 - adjust; } if (adjust <= -4) { adjust = 7 + adjust; } return SerialDate.addDays(adjust, base); }
/** * Returns the earliest date that falls on the specified day-of-the-week and is AFTER the base * date. * * @param targetWeekday a code for the target day-of-the-week. * @param base the base date. * @return the earliest date that falls on the specified day-of-the-week and is AFTER the base * date. */ public static SerialDate getFollowingDayOfWeek(final int targetWeekday, final SerialDate base) { // check arguments... if (!SerialDate.isValidWeekdayCode(targetWeekday)) { throw new IllegalArgumentException("Invalid day-of-the-week code."); } // find the date... final int adjust; final int baseDOW = base.getDayOfWeek(); if (baseDOW > targetWeekday) { adjust = 7 + Math.min(0, targetWeekday - baseDOW); } else { adjust = Math.max(0, targetWeekday - baseDOW); } return SerialDate.addDays(adjust, base); }