java计算时间的秒数差,去掉周末和节假日
java计算时间的秒数差,去掉周末和节假日
如题所说,计算两个时间的秒数(工作日),拿到这个需求,首先想到的就是怎么去掉周末和节假日,或者两个时间有一个在周末或节假日,或者两个时间都在,要分别进行处理。
说一下我自己的思路,我是一步步的去判断比较的:
1、首先判断开始日期是否大于结束日期,万一呢,多加个判断准没错
2、比较两个日期是否在同一天,如果在同一天的话,判断开始时间是否是周六或者周日,是的话就直接返回0,不是就两个时间去减
3、获取两个日期之内的所有日期(包含两个日期当天),拿到两个日期当天进行判断,因为当时和业务确认了需求,所以只判断了周末;然后循环中间的日期,如果是周末,天数-1,如果是节假日天数+1
代码如下:
public String getDealDuration(String startTime, String endTime){logger.info("开始时间为:{}, 结束时间为:{}", startTime, endTime);//转成日期格式SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date sdate = null;Date edate = null;try {sdate = sdf.parse(startTime);edate = sdf.parse(endTime);} catch (ParseException e) {e.printStackTrace();}// 比较开始日期是否大于结束日期if(sdate.compareTo(edate) == 1){return "0";}// 比较两个日期是否在同一天if(sdate.compareTo(edate) == 0){// 比较两个日期是否都是周六或者周日SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");Date start = null;try {start = simple.parse(startTime);} catch (Exception e) {e.printStackTrace();}Calendar calendar = Calendar.getInstance();calendar.setTime(start);int startDay = calendar.get(Calendar.DAY_OF_WEEK);if(startDay == 1 || startDay == 7){return "0";}long time = (edate.getTime() - sdate.getTime()) / 1000;return String.valueOf(time);}//获取两个日期之内的所有日期List<String> days = getDays(startTime, endTime);if(days.size() == 0){return "0";}if(days.size() == 1){long time = (edate.getTime() - sdate.getTime()) / 1000;return String.valueOf(time);}//获取开始日期和结束日期,对开始日期和结束日期进行处理String startDate = days.get(0);String endDate = days.get(days.size() - 1);//判断开始时间和结束时间是不是周六日SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd");Date start = null;Date end = null;try {start = simple.parse(startDate);end = simple.parse(endDate);} catch (Exception e) {e.printStackTrace();}Calendar startCalendar = Calendar.getInstance();startCalendar.setTime(start);int startDay = startCalendar.get(Calendar.DAY_OF_WEEK);if(startDay == 1 || startDay == 7){startDate = startDate + " 23:59:59";try {sdate = sdf.parse(startDate);} catch (Exception e) {e.printStackTrace();}}Calendar endCalendar = Calendar.getInstance();endCalendar.setTime(end);int endDay = endCalendar.get(Calendar.DAY_OF_WEEK);if(endDay == 1 || endDay == 7){endDate = endDate + " 00:00:00";try {edate = sdf.parse(endDate);} catch (Exception e) {e.printStackTrace();}}//遍历循环每个日期,看是否是周六或周日或节假日Calendar calendar = Calendar.getInstance();int weekDay = 0;int holiday = 0;for (int i = 1; i < days.size() - 1; i++) {Date date = null;DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");try {date = dateFormat.parse(days.get(i));} catch (ParseException e) {e.printStackTrace();}calendar.setTime(date);//判断是否是周末int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);if (dayOfWeek == 1 || dayOfWeek == 7){weekDay += 1;}//判断是否是节假日Integer integer = workFormDao.selectWorkCalendar(DateTimeUtil.getFormatDateFromString(days.get(i), "yyyy-MM-dd"));if(!"".equals(String.valueOf(integer)) && integer != null){if(integer == 0){weekDay += 1;}if(integer == 1){holiday += 1;}}}long time = (edate.getTime() - sdate.getTime()) / 1000 + holiday * 24 * 3600 - weekDay * 24 * 3600;return String.valueOf(time); }public static List<String> getDays(String startTime, String endTime) {// 返回的日期集合List<String> days = new ArrayList<>();DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");try {Date start = dateFormat.parse(startTime);Date end = dateFormat.parse(endTime);Calendar tempStart = Calendar.getInstance();tempStart.setTime(start);Calendar tempEnd = Calendar.getInstance();tempEnd.setTime(end);tempEnd.add(Calendar.DATE, +1);// 日期加1(包含结束)while (tempStart.before(tempEnd)) {days.add(dateFormat.format(tempStart.getTime()));tempStart.add(Calendar.DAY_OF_YEAR, 1);}} catch (Exception e) {e.printStackTrace();}return days; }
自己的处理确实有点复杂,欢迎大家提供新的思路。
java计算时间的秒数差,去掉周末和节假日相关推荐
- oracle中时间差转秒,oracle计算时间秒数差
--计算plsql处理时间差 --qzq declare time1 timestamp; --开始时间 time2 timestamp; --结束时间 sum1 number(9); --时间差(s ...
- C计算1970年到现在时间的秒数
//*********************************************** //函数功能:计算1970年到现在时间的秒数 //入口参数:Y,M,D,h,m,s当前的年,月,日, ...
- 【C语言】日期时间转秒数
日期时间转秒数 将例如"2020年8月14日 12:30:15"的日期时间转换为从1970年1月1日0时0分0秒开始至今的UTC时间秒数,不计闰秒.(中国大陆.中国香港.中国澳门. ...
- java计算时间差距_硬计算和软计算之间的差异
java计算时间差距 什么是计算? (What is Computing?) The process of accomplishing a particular task with the help ...
- 【Windows】windows10时间显示秒数
一般情况下windows10的电脑时间只显示小时和分钟,但是有的用户想要时间显示更加精细,那么windows10时间怎么显示秒呢?大家可以通过修改注册表的方式进行设置:打开注册表编辑器,定位到Adva ...
- 【Windows】windows10 时间显示秒数
windows10 时间显示秒数 1.win+R打开运行对话框,输入 regedit回车,打开注册表编辑器 2.在注册表编辑器中找到 HKEY_CURRENT_USER > SOFTWARE & ...
- php获取当前时间的秒数
php获取当前时间的秒数 解决方法: 其中time() 函数返回从1970-01-01 00:00:00起到现在的时间的秒数. 用法:http://www.yayihouse.com/yayishu ...
- Java计算时间区间内工作日天数
Java计算时间区间内工作日天数,并去除放假日与周末重叠数据 实际生活中,国家法定假日可能与周六周日重叠,所以需要去重.对于放假补班的特殊情况,需要另外补充 实际生活中,国家法定假日可能与周六周日重叠 ...
- Java 计算一段时间段内除去周六日、节假日的工作日数———超详细(全)
Java 计算一段时间段内除去周六日.节假日的工作日数'' 1.前端界面简介 2.后台处理代码 3.注: <END> 实现功能提要: 本文章记录的是某段时间的起止时间段内的工作日,既是除去 ...
最新文章
- ie7和ie8 select使用jquery clone不兼容处理
- 字节跳动一面:i++ 是线程安全的吗?
- 深度解析Python的内存管理机制:垃圾回收机制
- Java虚拟机:对象创建过程与类加载机制、双亲委派模型
- WinExec, ShellExecute,CreateProcess的对比
- 【BootStrap】初步教程
- Spring MVC中的验证组
- 智慧气象机器_智慧电缆隧道火热建设中 传感器+机器人成标配
- 【4】搭建Docker私服harbor
- mysql poolsize_thread_pool_size的调整
- android学习--TabHost选项卡组件
- HTML5实践 -- 使用css装饰你的图片画廊
- java中的比较运算符_Java基础---Java中的比较运算符(十三)
- 关于作者(《蓝调口琴指南》名作拙译)
- CGLIB实现AOP,MethodInterceptor接口和Enhancer详解——Spring AOP(四)
- iOs LightBlue与cc2540 BLE开发板之间的通信实验 [原创, 多图]
- tailf追踪日志文件
- itext修改pdf文字
- c语言unit id是什么,小程序再升级之什么是UnitionID
- dmg文件 linux,Linux通过命令行建立dmg文件的方法