Java 计算两个时间点包含工作日天数【拿来即用】

简介: Java 计算两个时间点包含工作日天数【拿来即用】

点赞 + 收藏,开发直接用

计算两个时间工作日天数差。

  1. 方法忽略法定节假日;
  2. 忽略周末补充上班;
  3. stop当天算入计算天数;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * https://gitee.com/rodert/JavaPub
 */

public class CalcWorkDays {

    public static void main(String[] args) throws ParseException {
        LocalDateTime localDateTimeStart = LocalDateTime.ofInstant(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2022-01-01 01:30:10").toInstant(), ZoneId.systemDefault());
        LocalDateTime localDateTimeEnd = LocalDateTime.ofInstant(new SimpleDateFormat("yyyy-MM-dd").parse("2022-12-31").toInstant(), ZoneId.systemDefault());
        System.out.println(localDateTimeStart + " ~ " + localDateTimeEnd + " 包含工作日:" + getTimeDiffDay(localDateTimeStart, localDateTimeEnd));

    /**
     * 计算两个时间工作日天数差。
     * 1. 方法忽略法定节假日;
     * 2. 忽略周末补充上班;
     * 3. stop当天算入计算天数;
     *
     * @param localDateTimeStart
     * @param localDateTimeStop
     * @return
     * @throws ParseException
     */
    public static int getTimeDiffDay(LocalDateTime localDateTimeStart, LocalDateTime localDateTimeStop) throws ParseException {
        if (localDateTimeStart.isAfter(localDateTimeStop)) {
            return -1;
        }
        System.out.println(localDateTimeStart);
        Date begin = Date.from(localDateTimeStart.atZone(ZoneId.systemDefault()).toInstant());
        Date endTime = Date.from(localDateTimeStop.atZone(ZoneId.systemDefault()).toInstant());
        Calendar cEnd = new GregorianCalendar();
        cEnd.setTime(endTime);
        // 计算时算入stop当天
        cEnd.add(Calendar.DATE, 1);
        Date end = cEnd.getTime();
        Calendar c = Calendar.getInstance();
        c.setTime(begin);
        int count = 0;
        while (c.getTime().before(end)) {
            // 非周末
            if (c.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && c.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                count++;
            }
            c.add(Calendar.DATE, 1);
        }
        return count;
    }
}

目录
相关文章
|
20天前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
1月前
|
Java API
探讨Java集合的组内平均值计算
探讨Java集合的组内平均值计算
12 1
|
19天前
|
并行计算 监控 Java
Java中的并行计算与任务分发策略
Java中的并行计算与任务分发策略
|
29天前
|
Java 容器
中缀表达式计算(java)
中缀表达式计算(java)
16 0
|
29天前
|
Java
java8日期计算(偏移N周,返回指定星期的日期)
java8日期计算(偏移N周,返回指定星期的日期)
16 0
|
29天前
|
Java
使用java编写小学三年级竖式计算
使用java编写小学三年级竖式计算
18 0
|
1月前
|
Java
使用java计算一个字符串中字母出现的次数
使用java计算一个字符串中字母出现的次数
13 0
|
1月前
|
前端开发 JavaScript Java
计算Java项目|基于SpringBoot的协力服装厂服装生产管理系统的设计与实现
计算Java项目|基于SpringBoot的协力服装厂服装生产管理系统的设计与实现
|
13天前
|
Java 调度
Java线程的六种状态
Java线程有六种状态: 初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)、终止(TERMINATED)。
34 1
|
2天前
|
监控 Java
Java并发编程:深入理解线程池
在Java并发编程领域,线程池是提升应用性能和资源管理效率的关键工具。本文将深入探讨线程池的工作原理、核心参数配置以及使用场景,通过具体案例展示如何有效利用线程池优化多线程应用的性能。