排除节假日的功能

Jdbc数据库连接

package com.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class DBConn {
        public static final String url = "jdbc:mysql://localhost:3306/test";  
        public static final String name = "com.mysql.jdbc.Driver";  
        public static final String user = "root";  
        public static final String password = "152152";  

        Connection conn = null;
        public PreparedStatement pst = null;  

        public Connection Conn() {  
            try {  
                Class.forName(name);
                conn = DriverManager.getConnection(url, user, password);
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return conn;
        }  

        public void close() {  
            try {  
                this.conn.close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
    }  
}

首先生成休息日和节假日到数据库

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.test.pojo.Days;

public class Dtaetest {
    public static void main(String[] args){
            //驱动程序名
             String driver = "com.mysql.jdbc.Driver"; 
             //要插入的数据库,表
             String url = "jdbc:mysql://127.0.0.1:3306/test";  
             String user = "root"; 
             String password = "152152";
             try {    
                       //加载驱动程序
                       Class.forName(driver);  
                       //连续MySQL 数据库
                       Connection conn = DriverManager.getConnection(url, user, password);
                       if(!conn.isClosed())
                       System.out.println("Succeeded connecting to the Database!");
                       //statement用来执行SQL语句
                       Statement statement = conn.createStatement();

                       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                       java.util.Date start = sdf.parse("2017-01-01");//开始时间
                       java.util.Date end = sdf.parse("2017-12-31");//结束时间
                       List<Date> lists = dateSplit(start, end);

                       //-------------------插入周末时间---------------
                       if (!lists.isEmpty()) {
                           for (Date date : lists) {
                          Calendar cal = Calendar.getInstance();
                           cal.setTime(date);
                               if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)
                               {
                              System.out.println("插入日期:" + sdf.format(date) + ",周末");
                              String insertSql = "INSERT INTO fn_all_holiday (title,holiday_date) VALUES("+"'周末','"+sdf.format(date)+"')";
                              statement.executeUpdate(insertSql);
                               }
                           }
                       }

                       //---------------插入节假日时间------------------
                       List<Days> holidays = new ArrayList<Days>();

                       holidays.add(new Days(1,"元旦", sdf.parse("2017-01-01")));
                       holidays.add(new Days(2,"元旦", sdf.parse("2017-01-02")));
                       holidays.add(new Days(3,"元旦", sdf.parse("2017-01-03")));

                       holidays.add(new Days(4,"春节", sdf.parse("2017-02-07")));
                       holidays.add(new Days(5,"春节", sdf.parse("2017-02-08")));
                       holidays.add(new Days(6,"春节", sdf.parse("2017-02-09")));
                       holidays.add(new Days(7,"春节", sdf.parse("2017-02-10")));
                       holidays.add(new Days(8,"春节", sdf.parse("2017-02-11")));
                       holidays.add(new Days(9,"春节", sdf.parse("2017-02-12")));
                       holidays.add(new Days(10,"春节", sdf.parse("2017-02-13")));

                       holidays.add(new Days(11,"清明节", sdf.parse("2017-04-02")));
                       holidays.add(new Days(12,"清明节", sdf.parse("2017-04-03")));
                       holidays.add(new Days(13,"清明节", sdf.parse("2017-04-04")));

                       holidays.add(new Days(14,"劳动节", sdf.parse("2017-04-30")));
                       holidays.add(new Days(15,"劳动节", sdf.parse("2017-05-01")));
                       holidays.add(new Days(16,"劳动节", sdf.parse("2017-05-02")));

                       holidays.add(new Days(17,"端午节", sdf.parse("2017-06-09")));
                       holidays.add(new Days(18,"端午节", sdf.parse("2017-06-10")));
                       holidays.add(new Days(19,"端午节", sdf.parse("2017-06-11")));

                       holidays.add(new Days(20,"中秋节", sdf.parse("2017-09-15")));
                       holidays.add(new Days(21,"中秋节", sdf.parse("2017-09-16")));
                       holidays.add(new Days(22,"中秋节", sdf.parse("2017-09-17")));

                       holidays.add(new Days(23,"国庆节", sdf.parse("2017-10-01")));
                       holidays.add(new Days(24,"国庆节", sdf.parse("2017-10-02")));
                       holidays.add(new Days(25,"国庆节", sdf.parse("2017-10-03")));
                       holidays.add(new Days(26,"国庆节", sdf.parse("2017-10-04")));
                       holidays.add(new Days(27,"国庆节", sdf.parse("2017-10-05")));
                       holidays.add(new Days(28,"国庆节", sdf.parse("2017-10-06")));
                       holidays.add(new Days(29,"国庆节", sdf.parse("2017-10-07")));
                       for(Days day:holidays) {
                      //跟周末冲突的,不重复插入
                           String sql = "select count(1) as numbers from fn_all_holiday where holiday_date ='" + sdf.format(day.getDate()) + "'";
                           //结果集
                           ResultSet rs = statement.executeQuery(sql);
                           boolean hasRecord = false;
                           while(rs.next()) {

                          if(!"0".equals(rs.getString("numbers"))) {
                          hasRecord = true;
                          }
                           }
                           if(!hasRecord) {
                          System.out.println("插入日期:" + sdf.format(day.getDate()) + "," + day.getTitle());
                          String insertSql = "INSERT INTO fn_all_holiday (title,holiday_date) VALUES('"+day.getTitle()+"','"+sdf.format(day.getDate())+"')";
                          statement.executeUpdate(insertSql);
                       }
                   }
                       conn.close();
                 }
              catch(ClassNotFoundException e) { 
                System.out.println("Sorry,can't find the Driver!");
                e.printStackTrace();
               }
              catch(SQLException e) {
                e.printStackTrace();
              }
              catch(Exception e) {  
                e.printStackTrace(); 
               }
          }

    private static List<Date> dateSplit(java.util.Date start, Date end) throws Exception {
        if (!start.before(end))
            throw new Exception("开始时间应该在结束时间之后");
        Long spi = end.getTime() - start.getTime();
        Long step = spi / (24 * 60 * 60 * 1000);// 相隔天数

        List<Date> dateList = new ArrayList<Date>();
        dateList.add(end);
        for (int i = 1; i <= step; i++) {
            dateList.add(new Date(dateList.get(i - 1).getTime() - (24 * 60 * 60 * 1000)));// 比上一天减一
        }
        return dateList;
    }
    }

在写测试类

package com.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import com.test.jdbc.DBConn;

/**  
 * <p>Title: main </P> 
 * <p>Description: TODO </P> 
 * @param args 
 * return void    返回类型  
 * throws  
 * date 2014-11-24 上午09:11:47 
 */  
public class DateUtil{
public static void main(String[] args) {  
    try {  
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
         DBConn conn = new DBConn();
         Connection conn2 = conn.Conn();
         String sql= "select * from lian";
         PreparedStatement statement = conn2.prepareStatement(sql);

         ResultSet resultSet = statement.executeQuery();
         //定义集合封装立案时间
         List<Calendar> lians=new ArrayList<>();
         while(resultSet.next()){
             String holiday = resultSet.getString(2);
             Calendar calendar= Calendar.getInstance();
             Date date = df.parse(holiday);
             calendar.setTime(date);
             lians.add(calendar);
             System.out.println("所有立案时间:"+df.format(date));
         }
         for (Calendar calendar : lians) {
             //初始化集合
             initHolidayList();
             //10个工作日排除法定节日和双休后的日期
             String c = addDateByWorkDay(calendar,10);  
//           System.out.println("开始日期:"+df.format(calendar));
             System.out.println("10个工作日排除法定节日和双休后的日期:"+c);  

        }

    } catch ( Exception e) {  
        // TODO: handle exception  

        e.printStackTrace();  
    }  

}  

 private static List<Calendar> holidayList = new ArrayList<Calendar>();  //节假日列表  

 /** 
  *  
  * <p>Title: addDateByWorkDay </P> 
  * <p>Description: TODO  计算相加day天,并且排除节假日和周末后的日期</P> 
  * @param calendar  当前的日期 
  * @param day  相加天数 
  * @return    
  * return Calendar    返回类型   返回相加day天,并且排除节假日和周末后的日期 
  * throws  
  * date 2014-11-24 上午10:32:55 
  */  
 public static String addDateByWorkDay(Calendar calendar,int day){  

     try {  
        for (int i = 0; i < day; i++) {  
              //天数加1
             calendar.add(Calendar.DAY_OF_MONTH, 1);  
               //校验是否是休息日
             if(checkHoliday(calendar)){ 
                 //是,这天不算
                 i--;  
             }  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
    return  df.format(calendar.getTime());  
 }  

 /** 
  *  
  * <p>Title: checkHoliday </P> 
  * <p>Description: TODO 验证日期是否是节假日</P> 
  * @param calendar  传入需要验证的日期 
  * @return  
  * return boolean    返回类型  返回true是节假日,返回false不是节假日 
  * throws  
  * date 2014-11-24 上午10:13:07 
  */  
 public static boolean checkHoliday(Calendar calendar) throws Exception{  

     //判断日期是否是周六周日  
     if(calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY ||   
             calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY){  
         return true;  
     }  
     //判断日期是否是节假日  
     for (Calendar ca : holidayList) {  
        if(ca.get(Calendar.MONTH) == calendar.get(Calendar.MONTH) &&  
                ca.get(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH)&&  
                ca.get(Calendar.YEAR) == calendar.get(Calendar.YEAR)){  
            return true;  
        }  
    }  

     return false;  
 }  

 /** 
  *  
  * <p>Title: initHolidayList </P> 
  * <p>Description: TODO  把所有节假日放入list,验证前要先执行这个方法</P> 
  * @param date  从数据库查 查出来的格式2014-05-09 
  * return void    返回类型  
  * throws  
  * date 2014-11-24 上午10:11:35 
 * @throws Exception 
  */  
public static  void initHolidayList() throws Exception {  
  //创建数据库连接
    DBConn conn = new DBConn();
    Connection connection = conn.Conn();
    //查询表
    String sql = "select * from fn_all_holiday";

    PreparedStatement statement = connection.prepareStatement(sql);
    //得到结果集
    ResultSet resultSet = statement.executeQuery();

    while (resultSet.next()) {
        //去结果集的时间字段
        String string = resultSet.getString(3);
        String[] da = string.split("-");
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, Integer.valueOf(da[0]));
        calendar.set(Calendar.MONTH, Integer.valueOf(da[1]) - 1);// 月份比正常小1,0代表一月
        calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(da[2]));
        //把结果集放入集合
        holidayList.add(calendar);
    }

}
}

运行结果如下:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值