S
S
Sintasy2015-04-07 16:37:32
Java
Sintasy, 2015-04-07 16:37:32

Calculating working hours between two dates?

Looking for a liba that can do this. At the input are two dates + periods in any format that determine whether the time is working or not.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
E
exenza, 2015-04-08
@Sintasy

Objectlabkit is a wrapper around joda-time.
Or work hours calculation from jBPM

V
Vladimir Smirnov, 2015-04-08
@bobzer

I've been looking for it too, but haven't found anything useful. It turned out that writing all the logic yourself is not such a big deal. I'll throw off the Java sources of a couple of methods, I hope it helps to understand the direction. Sources under GWT, you will need to replace DateTimeFormat with SimpleDateFormat and redo 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 and holidays - HashSets read from the database and filled in the database by the System admin for each year. workWeekends - working days instead of weekends, holidays - weekends instead of working days.
You'll figure out the rest...

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question