zoukankan      html  css  js  c++  java
  • java计算两个日期之间的天数,排除节假日和周末

    如题所说,计算两个日期之前的天数,排除节假日和周末。这里天数的类型为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<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;
    }
  • 相关阅读:
    24. Swap Nodes in Pairs
    23. Merge k Sorted Lists
    shell脚本报错:"[: =: unary operator expected"
    一种用 数组元素 指定 所调函数 的方法
    阻塞 非阻塞
    Linux open() 一个函数,两个函数原型
    QT 执行windows cmd 命令并读取结果
    Qt5 escape spaces in path
    获取磁盘的 总容量,空余容量,已用容量 【windows】
    通过进程名称,获取其路径
  • 原文地址:https://www.cnblogs.com/yzdtofly/p/7157280.html
Copyright © 2011-2022 走看看