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;
    }
}

目录
相关文章
|
19天前
|
Java 测试技术 API
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
【6月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
16 3
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
|
1天前
|
Java API
探讨Java集合的组内平均值计算
探讨Java集合的组内平均值计算
6 1
|
19小时前
|
Java
使用java编写小学三年级竖式计算
使用java编写小学三年级竖式计算
8 0
|
22小时前
|
Java
使用java计算一个字符串中字母出现的次数
使用java计算一个字符串中字母出现的次数
3 0
|
28天前
|
Java
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配...
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配
40 2
|
10天前
|
前端开发 JavaScript Java
计算Java项目|基于SpringBoot的协力服装厂服装生产管理系统的设计与实现
计算Java项目|基于SpringBoot的协力服装厂服装生产管理系统的设计与实现
|
12天前
|
分布式计算 Java Hadoop
简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行
简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行
13 0
|
27天前
|
Java
Java实现加权平均分计算程序WeightedAverageCalculator
绩加权平均分计算程序,带UI界面和输入保存功能。
23 0
|
4天前
|
Java 程序员
从菜鸟到大神:JAVA多线程通信的wait()、notify()、notifyAll()之旅
【6月更文挑战第21天】Java多线程核心在于wait(), notify(), notifyAll(),它们用于线程间通信与同步,确保数据一致性。wait()让线程释放锁并等待,notify()唤醒一个等待线程,notifyAll()唤醒所有线程。这些方法在解决生产者-消费者问题等场景中扮演关键角色,是程序员从新手到专家进阶的必经之路。通过学习和实践,每个程序员都能在多线程编程的挑战中成长。
|
4天前
|
Java
并发编程的艺术:Java线程与锁机制探索
【6月更文挑战第21天】**并发编程的艺术:Java线程与锁机制探索** 在多核时代,掌握并发编程至关重要。本文探讨Java中线程创建(`Thread`或`Runnable`)、线程同步(`synchronized`关键字与`Lock`接口)及线程池(`ExecutorService`)的使用。同时,警惕并发问题,如死锁和饥饿,遵循最佳实践以确保应用的高效和健壮。
11 2