@Sintasy

Расчет рабочих часов между двумя датами?

Разыскивается либа, которая такое умеет. На входе две даты + периоды в любом формате, определяющие является время рабочим или нет.
  • Вопрос задан
  • 2369 просмотров
Решения вопроса 1
@exenza
Objectlabkit - обертка над joda-time.
Или расчет рабочих часов от jBPM
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@bobzer
Java EE Developer
Когда-то тоже разыскивал, ничего дельного не нашел. Оказалось, что написать всю логику самому - не такое уж большое дело. Скину Java-исходники пары методов, надеюсь, поможет понять направление. Исходники под GWT, надо будет заменить DateTimeFormat на SimpleDateFormat и переделать plusDays()...
/**
     * Метод проверяет, является ли указанная дата выходным днем, или праздничным днем. Также осуществляется
     * проверка - является ли указанная дата выходным днем, указанным как рабочий день (постановлением Правительства)
     * @param date проверяемая дата
     * @return признак, является ли указанная дата рабочим днем
     */
    public boolean isWorkingDay(Date date) {
        String dayOfWeek = DateTimeFormat.getFormat("EEE").format(date);
        String dateStr = DateTimeFormat.getFormat("yyyy-MM-dd").format(date);

        return (!dayOfWeek.startsWith("Sat") && !dayOfWeek.startsWith("Sun")
                && !holidays.contains(dateStr))
                ||
                workWeekends.contains(dateStr);
    }

    /**
     * Метод осуществляет проверку, является ли указанная дата выходным днем, и если да, то переносит дату на
     * следующий после выходных рабочий день.
     * @param date проверяемая дата
     * @return исходная дата либо дата первого рабочего дня после выходных
     */
    public Date getBusinessDate(Date date) {
        while (true) {
            if (isWorkingDay(date)) {
                return date;
            } else {
                date = plusDays(date, 1);
            }
        }
    }

    /**
     * Метод осуществляет расчет указанного количества рабочих дней, которые должны истечь с момента указанной
     * начальной даты, и возвращает дату наступления искомого срока
     * @param date    начальная дата, относительно которой осуществляется расчет
     * @param days    количество рабочих дней, которые должны пройти относительно начальной даты
     * @return искомая дата
     */
    public Date addBusinessDays(Date date, int days) {
        for (int i = 1; i < days; i++) {
            date = plusDays(date, 1);
            if (!isWorkingDay(date)) {
                days++;
            }
        }
        return date;
    }

    public static Date plusDays(Date date, int days) {
        Date clone = new Date(date.getTime());
        clone.setDate(date.getDate() + days);
        return clone;
    }


workWeekends и holidays - HashSet-ы, читаются из БД, а в БД заполняются админом Системы на каждый год. workWeekends - рабочие дни вместо выходных, holidays - выходные дни вместо рабочих.

Остальное додумаете сами...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы