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

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

原则:

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

实现步骤:

1.循环每个日期

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

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

代码:

public doublecalLeaveDays(Date startTime,Date endTime){

doubleleaveDays = 0;//从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1Date flag = startTime;//设置循环开始日期Calendar cal = Calendar.getInstance();

//循环遍历每个日期while(flag.compareTo(endTime)!=1){

cal.setTime(flag);//判断是否为周六日intweek = 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(); }

returnleaveDays;}

发现运行太慢了,更新了一下代码

实现步骤不变,不过把节假日先取出来,之前是每循环一个日期就要查一次数据库,现在只需要查一次数据库。

代码:

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;

}

智能跳过节假日算法java_java计算两个日期之间的天数,排除节假日和周末相关推荐

  1. 智能跳过节假日算法java_java计算两个日期之前的天数实例(排除节假日和周末)...

    java计算两个日期之前的天数实例(排除节假日和周末) 发布时间:2020-09-02 23:07:01 来源:脚本之家 阅读:108 作者:jingxian 如题所说,计算两个日期之前的天数,排除节 ...

  2. JavaScript:实现计算两个日期之间的天数算法(附完整源码)

    JavaScript:实现计算两个日期之间的天数算法 const isLeap = (year) => {if (year % 400 === 0) return trueelse if (ye ...

  3. java 两日期的周数_利用 Java 中 Calendar 计算两个日期之间的天数和周数

    利用 Java 中 Calendar 计算两个日期之间的天数和周数 前言 究竟什么是一个 Calendar 呢? 中文的翻译就是日历, 那我们立刻可以想到我们生活中有阳 (公) 历阴 (农) 历之分它 ...

  4. 如何利用计算机计算天数,如何应用Win10系统电脑中的计算器计算两个日期之间的天数?...

    如何应用Win10系统电脑中的计算器计算两个日期之间的天数? 相信很多小伙伴都有在使用windows10系统的电脑,其中的计算器如何才能用来计算两个日期之间的天数呢?方法很简单,下面小编就来为大家介绍 ...

  5. 微软面试题目(一) 计算两个日期之间的天数

    微软的面试,没能参加啊,只好打听了下题目,其中一题是在20分钟内写出:计算两个日期之间天数的方法.昨天晚上想了一下,今天实现了一下,经过调试,差不多一个小时才弄好,惭愧啊 代码如下: /******* ...

  6. sql年月日加减法,计算两个日期之间的天数

    1.年月日加减法(时间字段为  hiredate,表名为 emp) DB2 selecthiredate -5 day as hd_sub_5day,hiredate +5 day as hd_add ...

  7. 计算两个日期之间的天数,你知道哪些函数能够计算呢?

    有时候我们需要计算两个日期之间的天数,一般情况下只需要计算一两个的话可以直接口算,但是整个表格的日期都需要计算出他们之间的天数,还是用口算的方法吗?当然不能这么浪费时间!Excel中有计算两个日期之间 ...

  8. java怎么计算相隔多少天_java计算两个日期之间相差天数和相隔天数详解

    大家看到文章标题"两个日期之间相差天数和相隔天数",是否有疑惑呢!从中文字面理解,"相差"和"相隔"是有区别的,然而就是这些区别害死很多人, ...

  9. Go获取n天前或后的日期、日期转秒时间戳、计算两个日期之间的天数差

    获取n天前或后的日期: // GetBeforeTime 获取n天前的秒时间戳.日期时间戳 // _day为负则代表取前几天,为正则代表取后几天,0则为今天 func GetBeforeTime(_d ...

最新文章

  1. 前端学习(1172):模板字符串
  2. UE4 蓝图RandomStreams
  3. @程序员,夏天来了,你该送心仪女生这个啦
  4. 一些SharePoint 2007开发的在线课程
  5. 解释HTTP中Get和Post。它们有什么区别,哪个使用时更加安全?
  6. 数据库优化常用的途径(方法)
  7. 使用Bochs模拟器和IDA调试MBR
  8. 使用Python,OpenCV反转视频
  9. c语言数字大小32768,c语言中int(2byte)的表示范围是为什么是-32768~32767!
  10. 植物大战僵尸无尽版游泳池优秀阵容推荐(一)
  11. html送女朋友的网页,做一个网页送给心动女孩子生日礼物(表白也合适)
  12. 浙大OJ网址及ACM题目分类
  13. SCOI2012 Blinker的仰慕者 BZOJ 2757
  14. OneDrive账号被冻结如何进行解冻
  15. 你应该知道的十八大著名定律法则
  16. 非齐次Poisson过程的期望与方差
  17. 用Universe Sandbox模拟引力弹弓(地球+木星)
  18. Servlet之 http://localhost:8080/ 详解
  19. Java | 第一章:Java环境搭建
  20. FANUC机器人进行负载设定和负载推算的具体方法

热门文章

  1. 黑苹果open core引导 选择系统界面黑屏,但是可以盲操作左右移动和回车,进度条第一阶段没有苹果logo
  2. 贺州旱改水新丰景 国稻种芯·中国水稻节:广西改出乡村振兴
  3. 苹果13/Pro刘海凹槽更小,或搭载屏下指纹识别
  4. 如何用今日头条来赚钱?那些闷声发大财的达人们都是这样做的
  5. 工业设计公司常对设计有什么要求?
  6. Maven 错误找不到符号
  7. Zookeeper的数据模型和节点类型
  8. 微信小程序 企业微信客户服务插件【联系我】自定义样式
  9. HIT-哈工大数据结构-作业5(C++)
  10. 联想小新24/27寸一体机 酷睿版2022款评测