java - 仅计算两个日期之间的工作时间(不包括 Java 中的周末)

标签 java datetime hour weekday

我需要帮助, 如何计算两个日期之间的营业时间? 例如我们有两个日期; 2017 年 1 月 1 日 10:00 和 2017 年 1 月 4 日 15:00。 工作日我们的工作时间为 09:30 至 17:30(8 小时)。如何使用 Java 计算工作时间和分钟?

感谢您的帮助。

最佳答案

大家好!我遇到了类似的问题(计算时间戳之间的工作分钟数)并完成了这个解决方案。希望有人发现它有用:

public class WorkingMinutesCalculator {
    private static final int WORK_HOUR_START = 9;
    private static final int WORK_HOUR_END = 17;
    private static final long MINUTES = 60;

    private static final long WORKING_HOURS_PER_DAY = WORK_HOUR_END - WORK_HOUR_START;
    private static final long WORKING_MINUTES_PER_DAY = WORKING_HOURS_PER_DAY * MINUTES;

    public int getWorkingMinutesSince(final Timestamp startTime) {
        Timestamp now = Timestamp.from(Instant.now());
        return getWorkingMinutes(startTime, now);
    }

    public int getWorkingMinutes(final Timestamp startTime, final Timestamp endTime) {
        if (null == startTime || null == endTime) {
            throw new IllegalStateException();
        }
        if (endTime.before(startTime)) {
            return 0;
        }

        LocalDateTime from = startTime.toLocalDateTime();
        LocalDateTime to = endTime.toLocalDateTime();

        LocalDate fromDay = from.toLocalDate();
        LocalDate toDay = to.toLocalDate();

        int allDaysBetween = (int) (ChronoUnit.DAYS.between(fromDay, toDay) + 1);
        long allWorkingMinutes = IntStream.range(0, allDaysBetween)
                .filter(i -> isWorkingDay(from.plusDays(i)))
                .count() * WORKING_MINUTES_PER_DAY ;

        // from - working_day_from_start
        long tailRedundantMinutes = 0;
        if (isWorkingDay(from)) {
            if (isWorkingHours(from)) {
                tailRedundantMinutes = Duration.between(fromDay.atTime(WORK_HOUR_START, 0), from).toMinutes();
            } else if (from.getHour() > WORK_HOUR_START) {
                tailRedundantMinutes = WORKING_MINUTES_PER_DAY;
            }
        }

        // working_day_end - to
        long headRedundanMinutes = 0;
        if (isWorkingDay(to)) {
            if (isWorkingHours(to)) {
                headRedundanMinutes = Duration.between(to, toDay.atTime(WORK_HOUR_END, 0)).toMinutes();
            } else if (from.getHour() < WORK_HOUR_START) {
                headRedundanMinutes = WORKING_MINUTES_PER_DAY;
            }
        }
        return (int) (allWorkingMinutes - tailRedundantMinutes - headRedundanMinutes);
    }

    private boolean isWorkingDay(final LocalDateTime time) {
        return time.getDayOfWeek().getValue() < DayOfWeek.SATURDAY.getValue();
    }

    private boolean isWorkingHours(final LocalDateTime time) {
        int hour = time.getHour();
        return WORK_HOUR_START <= hour && hour <= WORK_HOUR_END;
    }
}

关于java - 仅计算两个日期之间的工作时间(不包括 Java 中的周末),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43903919/

相关文章:

java - Java中的多个窗口

扩展抽象类的Java过程

python - 计算python中的逐行时间差

python - 删除日期时间函数中的时间?

c# - 使用自定义 IFormatProvider 的 DateTime.ToString() 中月份的第一个字母

java - 如何在@JsonFormat中使毫秒可选,以便与Jackson进行时间戳解析?

java - 无法在配置中找到 Bean 方法 'elasticsearchTemplate'

Python:获取最后一小时的日期时间

Android - 找出现在是几点钟