How to find nearest week day for an arbitrary date?
- by Stig Brautaset
Is there a more elegant way than the below to find the nearest day of the week for a given date using JodaTime? I initially thought setCopy() would be it, but this sets the day to the particular day in the same week. Thus, if ld is 2011-11-27 and day is "Monday" the following function returns 2011-11-21, and not 2011-11-28 as I want.
    // Note that "day" can be _any_ day of the week, not just weekdays.
    LocalDate getNearestDayOfWeek(LocalDate ld, String day) {
        return ld.dayOfWeek().setCopy(day);
    }
Below is a work-around I came up with that works for the particular constraints in my current situation, but I'd love to get help find a completely generic solution that works always.
    LocalDate getNearestDayOfWeek(LocalDate ld, String day) {
        LocalDate target = ld.dayOfWeek().setCopy(day);
        if (ld.getDayOfWeek() > DateTimeConstants.SATURDAY) {
            target = target.plusWeeks(1);
        }
        return target;
    }
Looking more into this I came up with this, which seems to be a more correct solution, though it seems awfully complicated:
LocalDate getNearestDayOfWeek(LocalDate ld, String day) {
    LocalDate target = ld.dayOfWeek().setCopy(day);
    if (target.isBefore(ld)) {
        LocalDate nextTarget = target.plusWeeks(1);
        Duration sincePrevious = new Duration(target.toDateMidnight(), ld.toDateMidnight());
        Duration untilNext = new Duration(ld.toDateMidnight(), nextTarget.toDateMidnight());
        if (sincePrevious.isLongerThan(untilNext)) {
            target = nextTarget;
        }
    }
    return target;
}