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

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

原则:

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

实现步骤:

  1.循环每个日期

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

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

代码:

public double calLeaveDays(Date startTime,Date endTime){
double leaveDays = ;
//从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1
Date flag = startTime;//设置循环开始日期
Calendar cal = Calendar.getInstance();
  //循环遍历每个日期
while(flag.compareTo(endTime)!=){
cal.setTime(flag);
//判断是否为周六日
int week = cal.get(Calendar.DAY_OF_WEEK) - ;
if(week == 0 || week == ){//0为周日,6为周六
//跳出循环进入下一个日期
cal.add(Calendar.DAY_OF_MONTH, +);
flag = cal.getTime();
continue;
}
//判断是否为节假日
  try{
//从数据库查找该日期是否在节假日中
/*这里为数据库操作*/
      /*传入该日期flag,使用sql语句判断flag是否between节假日开始日期and节假日结束日期*/
      /*count为从数据库查出的行数*/
if (count > ){
//跳出循环进入下一个日期
         cal.add(Calendar.DAY_OF_MONTH, +);
         flag = cal.getTime();
continue;
        }
  }catch (Exception e){
e.printStackTrace();
  }
  //不是节假日或者周末,天数+1
leaveDays = leaveDays + ;
  //日期往后加一天
  cal.add(Calendar.DAY_OF_MONTH, +);
  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<Map> 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计算两个日期之间的天数,排除节假日和周末的更多相关文章

  1. JS计算两个日期之间的天数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. java计算两个日期之间相隔的天数

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  3. Java 计算两个日期相差的天数

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  4. Java计算两个日期相差的天数

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  5. iOS 计算两个日期之间的天数问题

    //获取当前时间若干年.月.日之后的时间 + (NSDate *)dateWithFromDate:(NSDate *)date years:(NSInteger)years months:(NSIn ...

  6. java计算两个日期之间相隔的月份(向下取整)

    最近需求里面有个需要计算两个日期之间相隔的月份,写起来还挺繁琐,需要将各种情况都要考虑到,写了一个作为以后自己的工具吧. //获取哪一天 public static int getDay(Date d ...

  7. element ui 日期控件范围时间限制记录、以及计算两个日期之间的天数

    日期的筛选经常会有最小的日期选择,例如:当前日期 :clearable="false" :picker-options="pickerOptions0" val ...

  8. java计算两个日期之间的相隔天数

    [原创] 之前在很多竞赛的题目中有这样饿一类题,计算给定两个日期之间的相隔天数,或者很多类似的题目,都是需要转化到这个问题上时,之前用c++写的时候思想是这样的,一个结构体,包括年月日,还有一个计算下 ...

  9. mysql计算两个日期之间的天数

    MYSQL自带函数计算给定的两个日期的间隔天数   有两个途径可获得   1.利用TO_DAYS函数   select to_days(now()) - to_days('20120512')   2 ...

随机推荐

  1. Dubbo实践(十六)集群容错

    Dubbo作为一个分布式的服务治理框架,提供了集群部署,路由,软负载均衡及容错机制.下图描述了Dubbo调用过程中的对于集群,负载等的调用关系: 集群 Cluster 将Directory中的多个In ...

  2. 登录SQLServer报错:无法连接到DESKTOP-LDJHQGN

    解决方法:下↓↓↓

  3. Xcode 5.1安装插件:规范凝视生成器VVDocumenter

    类似java的多行凝视! 安装过程: 1.前往GitHub下载project文件:VVDocumenter-Xcode 2.用Xcode打开project,Command + B Build成功后,能 ...

  4. Node.js 上传图片并保存

    Node.js 上传图片并保存 依赖 package.json 文件 { "name": "demo", "version": " ...

  5. 使用XWAF框架(5)——XML解析器:CXDP

    XWAF推出了自己的组合式XML文档解析器,英文名叫:“CXDP”,是“Combined XML Document Parser”的缩写.核心代码属XWAF原创,注释.日志和帮助文档采用全中文描述,特 ...

  6. 01 Oracle分区索引

    Oracle分区索引   索引与表类似,也可以分区: 分区索引分为两类: Locally partitioned index(局部分区索引) Globally partitioned index(全局 ...

  7. ie浏览器报 promise 问题

    1.首先安装:babel-polyfill    npm install babel-polyfill --save2.然后引入:babel-polyfill 在build目录下,webpack.ba ...

  8. 复习Vue

    以前学过vue,但是工作中一直没有用到都忘记了最近在复习下正好做个笔记偶尔看看,(目前常更新,2018年6月25日) 1.指令 setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. ...

  9. MySQL学习【第十一篇存储引擎之事务解释】

    一.innodb的核心特点------事务 1.什么是事务 在一组数据操作执行步骤,这些步骤被视为一个单元,主要针对dml语句(update.delete.insert) 2.事务ACID特性 Ato ...

  10. 偏前端 - 不是固定宽高,页面随设备同比 放大/缩小 展示。不妨看看rem单位,你就有眉目上手做了!!!

    为什么要使用rem 之前有些适配做法,是通过js动态计算viewport的缩放值(initial-scale). 例如以屏幕320像素为基准,设置1,那屏幕375像素就是375/320=1.18以此类 ...