Skip to content

Instantly share code, notes, and snippets.

@isicju
Last active March 5, 2024 12:59
Show Gist options
  • Save isicju/cc8ac5adaee19390e116743040799386 to your computer and use it in GitHub Desktop.
Save isicju/cc8ac5adaee19390e116743040799386 to your computer and use it in GitHub Desktop.
Ищем предыдущий будний, не праздничный день.
Напишите функцию которая вовращает предыдущий к текущей дате будний день.
Если предыдущий будний день - праздник то нужно вернуть предыдущий до него но также он должен быть будним днем.
Например для 2 марта 2023 (суббота) должен быть возвращено 1 марта (пятница).
Тот же случай с 2 марта 2023 должен вернуть четверг если 1 марта будет праздничным днем.
Вот сигнатура метода
Сигнатура с датой не уточнена, вы вольны сами решать какой именно формат даты передается и возвращается.
public Date getPreviousWeekDay(Date date, List<Date> publicHolidays){
//implementation.
}
@polo7
Copy link

polo7 commented Mar 4, 2024

Straightforward solution
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class DateProblem {
    public static Date getPreviousWorkingDay(Date date, List<Date> publicHolidays) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        do {
            calendar.add(Calendar.DAY_OF_YEAR, -1);
        } while (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
                || calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY
                || publicHolidays.contains(calendar.getTime()));
        return calendar.getTime();
    }

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd-M-yyyy");
        Date date = sdf.parse("05-03-2024");
        List<Date> holidays = List.of(sdf.parse("04-03-2024"));
        System.out.println(getPreviousWorkingDay(date, holidays));
    }
}

@alexey168
Copy link

alexey168 commented Mar 5, 2024

one more solution
private static final EnumSet<DayOfWeek> WEEKEND_DAYS = EnumSet.of(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);

    public LocalDate getPreviousWeekDay(LocalDate date, List<LocalDate> publicHolidays) {
        date = getPreviousDay(date);
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        while (WEEKEND_DAYS.contains(dayOfWeek) || publicHolidays.contains(date)) {
            date = getPreviousDay(date);
            dayOfWeek = date.getDayOfWeek();
        }
        return date;
    }
    private LocalDate getPreviousDay(LocalDate date){
        return date.minusDays(1);
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment