博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java计算两个日期之间的天数,排除节假日和周末
阅读量:6359 次
发布时间:2019-06-23

本文共 2806 字,大约阅读时间需要 9 分钟。

如题所说,计算两个日期之前的天数,排除节假日和周末。这里天数的类型为double,因为该功能实现的是请假天数的计算,有请一上午假的为0.5天。

不够很坑的是每个日期都要查询数据库,感觉很浪费时间。

原则:

  1.节假日存放在数据库中

实现步骤:

  1.循环每个日期

  2.判断每个日期是否为节假日或者为周末

  3.若不是节假日和周末,天数+1

 

代码:

public double calLeaveDays(Date startTime,Date endTime){
double leaveDays = 0; //从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1 Date flag = startTime;//设置循环开始日期 Calendar cal = Calendar.getInstance();   //循环遍历每个日期 while(flag.compareTo(endTime)!=1){
cal.setTime(flag); //判断是否为周六日 int week = cal.get(Calendar.DAY_OF_WEEK) - 1; if(week == 0 || week == 6){
//0为周日,6为周六 //跳出循环进入下一个日期 cal.add(Calendar.DAY_OF_MONTH, +1); flag = cal.getTime(); continue; } //判断是否为节假日   try{
//从数据库查找该日期是否在节假日中 /*这里为数据库操作*/       /*传入该日期flag,使用sql语句判断flag是否between节假日开始日期and节假日结束日期*/       /*count为从数据库查出的行数*/ if (count > 0){
//跳出循环进入下一个日期          cal.add(Calendar.DAY_OF_MONTH, +1);          flag = cal.getTime(); continue;         }   }catch (Exception e){
e.printStackTrace();   }   //不是节假日或者周末,天数+1 leaveDays = leaveDays + 1;   //日期往后加一天   cal.add(Calendar.DAY_OF_MONTH, +1);   flag = cal.getTime();  } return leaveDays; } 发现运行太慢了,更新了一下代码 实现步骤不变,不过把节假日先取出来,之前是每循环一个日期就要查一次数据库,现在只需要查一次数据库。 代码:
public double calLeaveDays(Date startTime,Date endTime){
double leaveDays = 0; //从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1 Date flag = startTime;//设置循环开始日期 Calendar cal = Calendar.getInstance(); //从数据库得到节假日的起始日期和终止日期 List maps = null; try{
maps = getDao().getHolidaysPeriod;//maps用于保存符合条件的所有节假日的起始日期和终止日期,如startDate:2017-07-13,endDate:2017-07-14 }catch (Exception e){
e.printStackTrace(); }   //用于格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); int week; outer:while(flag.compareTo(endTime)!=1){
cal.setTime(flag); //判断是否为周六日 week = cal.get(Calendar.DAY_OF_WEEK) - 1; if(week == 0 || week == 6){//0为周日,6为周六 //跳出循环进入下一个日期 cal.add(Calendar.DAY_OF_MONTH, +1); flag = cal.getTime(); continue; }else{
//判断是否为节假日 if(maps != null || !maps.isEmpty()){
inner:for (Map map : maps){
if(flag.compareTo((Date)map.get("startDay"))>-1&&flag.compareTo((Date)map.get("endDay"))<1){
              //跳出循环进入下一个日期
              cal.add(Calendar.DAY_OF_MONTH, +1);                         flag = cal.getTime();                         continue outer;                     }                 }             }         }         leaveDays = leaveDays + 1;         //日期往后加一天         cal.add(Calendar.DAY_OF_MONTH, +1);         flag = cal.getTime();     }     return leaveDays; }

转载于:https://www.cnblogs.com/yzdtofly/p/7157280.html

你可能感兴趣的文章
第三章:基本概念
查看>>
Jersey+mybatis实现web项目第一篇
查看>>
C++形参中const char * 与 char * 的区别
查看>>
espresso 2.0.4 Apple Xcode 4.4.1 coteditor 价格
查看>>
Object-C中emoji与json的问题
查看>>
linux 命令
查看>>
灾后重建
查看>>
Nothing 和 Is
查看>>
第一个sprint冲刺第三天
查看>>
周末web前端练习
查看>>
hdu 5754 Life Winner Bo 博弈论
查看>>
Overlay network 覆盖网络
查看>>
Linux之编译需要的文件变化时刻
查看>>
IntelliJ IDEA中怎么查看方法说明?
查看>>
mvn常用命令
查看>>
redis zset 顺序问题
查看>>
C# 判断网站是不是discuz论坛
查看>>
TypeScript--接口
查看>>
JavaScript高级程序设计(3)
查看>>
2019年的前端学习计划
查看>>