这个解决方法网上是没有,只是一些片段。以下以2017年全年为例

准备工作将2017年的所有假期,调休,节假日和周末重叠的部分挑出来

2017年法定节假日统计

元旦: 2017.1.1---1.2                           ###3天
       1.1---重叠周末1

春节: 1.271.281.291.301.312.12.2   ###7天  
       1.281.29---重叠周末2
       
2月28天

清明节: 4.2,4.3,4.4                            ###3天
        4.2---重叠周末1

五一劳动节: 4.294.305.1                    ###3天
         4.294.30---重叠周末2  

端午节:    5.28,5.29,5.30                      ###3天
         5.28---重叠周末1

国庆节中秋:10.1,10.2,10.3,10.4,10.5,10.6,10.7,10.8   ###8天      
       10.1,10.7,10.8---重叠周末3

接2018年元旦:12.30,12.31                       ###3天
            12.30,12.31---重叠周末2

 !周末法定加班1.22,2.4,4.1,5.27,9.30,     

2.创建一个数据表

 

写java代码运行并生成上面创建的数据表里数据。生成的数据是2017全年的周末,节假日,调休,节假日和周末重叠等

package yuanma;

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 java.util.UUID;
/**
 * 将一年内的所有假日插入到假日表里
 * @author ch
 * @time 2017-1-15 下午6:06:11
 */
public class InsertHolidayUtil3 {
  public static void main(String[] args){
    //驱动程序名
     String driver = "com.mysql.jdbc.Driver"; 
     //要插入的数据库,表
     String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8";  
     String user = "root"; 
     String password = "";
     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 pre_complain3 (id,object_type,CREATE_Time) VALUES(\'"+UUID.randomUUID()+"\',"+"\'周末\',\'"+sdf.format(date)+"\')";
                      statement.executeUpdate(insertSql);
                       }
                   }
               }
               
               //---------------插入节假日时间------------------
               List<Days> holidays = new ArrayList<Days>();
//               holidays.add(new Days(UUID.randomUUID().toString(),"元旦", sdf.parse("2017-01-01")));//--这种带//--是因为和周末重叠,所以去除
               holidays.add(new Days(UUID.randomUUID().toString(),"元旦", sdf.parse("2017-01-02")));
               //接2018年的元旦节日
               holidays.add(new Days(UUID.randomUUID().toString(),"元旦", sdf.parse("2017-12-30")));
               holidays.add(new Days(UUID.randomUUID().toString(),"元旦", sdf.parse("2017-12-31")));
               
               holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2017-01-27")));
//               holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2017-01-28")));//--
//               holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2017-01-29")));//--
               holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2017-01-30")));
               holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2017-01-31")));
               holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2017-02-01")));
               holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2017-02-02")));
               
               holidays.add(new Days(UUID.randomUUID().toString(),"清明节", sdf.parse("2017-04-02")));
               holidays.add(new Days(UUID.randomUUID().toString(),"清明节", sdf.parse("2017-04-03")));
//               holidays.add(new Days(UUID.randomUUID().toString(),"清明节", sdf.parse("2017-04-04")));//--
               
//               holidays.add(new Days(UUID.randomUUID().toString(),"劳动节", sdf.parse("2017-04-29")));//--
//               holidays.add(new Days(UUID.randomUUID().toString(),"劳动节", sdf.parse("2017-04-30")));//--
               holidays.add(new Days(UUID.randomUUID().toString(),"劳动节", sdf.parse("2017-05-01")));
               
//               holidays.add(new Days(UUID.randomUUID().toString(),"端午节", sdf.parse("2017-05-28")));//--
               holidays.add(new Days(UUID.randomUUID().toString(),"端午节", sdf.parse("2017-05-29")));
               holidays.add(new Days(UUID.randomUUID().toString(),"端午节", sdf.parse("2017-05-30")));
               
//               holidays.add(new Days(UUID.randomUUID().toString(),"中秋节", sdf.parse("2017-09-15")));
//               holidays.add(new Days(UUID.randomUUID().toString(),"中秋节", sdf.parse("2017-09-16")));
//               holidays.add(new Days(UUID.randomUUID().toString(),"中秋节", sdf.parse("2017-09-17")));
               //中秋和国庆重叠
//               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-01")));//--
               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-02")));
               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-03")));
               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-04")));
               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-05")));
               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-06")));
//               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-07")));//--
//               holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2017-10-08")));//--
               for(Days day:holidays) {
              //跟周末冲突的,不重复插入
                   String sql = "select count(1) as numbers from pre_complain3 where CREATE_Time =\'" + 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 pre_complain3 (id,object_type,CREATE_Time) VALUES(\'"+day.getId()+"\',"+"\'"+day.getTitle()+"\',\'"+sdf.format(day.getDate())+"\')";
                  statement.executeUpdate(insertSql);
                   }
               }
               
               
               //-------------- 剔除补班时间(周末需要补班的)---------------------
               List<Days> workDays = new ArrayList<Days>();
               workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2017-01-22")));
               workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2017-02-04")));
               workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2017-04-01")));
               workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2017-05-27")));
               workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2017-09-30")));
//               workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2017-10-08")));
//               workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2017-10-09")));
               
               for(Days day:workDays) {
              System.out.println("剔除日期:" + sdf.format(day.getDate()) + "," + day.getTitle());
              String delSql = "delete from pre_complain3 where CREATE_Time =\'" + sdf.format(day.getDate()) + "\'";
              statement.executeUpdate(delSql);
               }
               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;
}


}

 4.打印两个时间段需要多少工作日

package yuanma3;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class GetYMD {

    public static void main(String[] args) throws ParseException {
//这里是数据库表生成的2017年的非工作日表。我是用数组的方式实现,这个比较简单 String[] str
= { "2017-01-27", "2017-07-15", "2017-10-14", "2017-12-02", "2017-09-24", "2017-10-05", "2017-07-01", "2017-10-06", "2017-07-22", "2017-04-09", "2017-07-09", "2017-06-24", "2017-08-05", "2017-05-20", "2017-12-24", "2017-11-18", "2017-10-22", "2017-05-06", "2017-07-29", "2017-01-28", "2017-05-30", "2017-05-21", "2017-11-04", "2017-01-14", "2017-01-15", "2017-01-07", "2017-03-04", "2017-06-04", "2017-06-17", "2017-07-02", "2017-07-16", "2017-06-25", "2017-05-07", "2017-01-31", "2017-01-30", "2017-10-29", "2017-01-21", "2017-03-12", "2017-04-30", "2017-06-11", "2017-01-02", "2017-02-05", "2017-09-10", "2017-10-07", "2017-12-10", "2017-03-25", "2017-10-01", "2017-04-15", "2017-07-23", "2017-03-11", "2017-02-25", "2017-03-05", "2017-08-13", "2017-12-09", "2017-10-21", "2017-05-14", "2017-02-11", "2017-02-18", "2017-10-08", "2017-05-01", "2017-04-03", "2017-05-13", "2017-11-12", "2017-04-22", "2017-05-28", "2017-11-26", "2017-11-11", "2017-12-17", "2017-08-27", "2017-09-17", "2017-07-08", "2017-09-09", "2017-10-03", "2017-02-12", "2017-08-12", "2017-04-23", "2017-12-30", "2017-12-31", "2017-03-19", "2017-11-25", "2017-03-18", "2017-02-02", "2017-12-16", "2017-06-03", "2017-11-19", "2017-10-15", "2017-10-04", "2017-04-16", "2017-03-26", "2017-01-29", "2017-02-26", "2017-06-18", "2017-06-10", "2017-01-01", "2017-02-01", "2017-04-08", "2017-10-02", "2017-08-26", "2017-10-28", "2017-08-20", "2017-12-03", "2017-09-16", "2017-04-02", "2017-02-19", "2017-04-29", "2017-05-29", "2017-09-02", "2017-08-06", "2017-08-19", "2017-01-08", "2017-11-05", "2017-09-23", "2017-12-23", "2017-07-30", "2017-09-03" }; // -------------------------- Calendar cal = Calendar.getInstance(); String start = "2017-04-01"; String end = "2017-04-30"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date dBegin = sdf.parse(start); Date dEnd = sdf.parse(end); List<Date> lDate = findDates(dBegin, dEnd); int de = lDate.size(); int de3 = de; System.out.println("de3" + de3); for (Date date : lDate) { int i = 1; // int de; for (String v : str) { if (v.equals(sdf.format(date))) { System.out.println("000:" + sdf.format(date)); de3 -= i; } } // System.out.println(i); System.out.println(sdf.format(date)); } System.out.println(de3); } public static List<Date> findDates(Date dBegin, Date dEnd) { List lDate = new ArrayList(); lDate.add(dBegin); Calendar calBegin = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calBegin.setTime(dBegin); Calendar calEnd = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calEnd.setTime(dEnd); // 测试此日期是否在指定日期之后 while (dEnd.after(calBegin.getTime())) { // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.DAY_OF_MONTH, 1); lDate.add(calBegin.getTime()); } return lDate; } }

 5.scala处理原型udf

import java.text.SimpleDateFormat
import java.util.Calendar

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

import scala.collection.mutable.ArrayBuffer
object date {
  def main(args: Array[String]) {


    //计算时间间隔
    val conf = new SparkConf().setAppName("java_date").setMaster("local")
    val spark = SparkSession.builder().enableHiveSupport().config(conf).getOrCreate()
    //产生日期序列
    import java.util.Calendar
    import java.util.Date
    import java.text.SimpleDateFormat
    import scala.collection.mutable.ListBuffer

    val startTime: String = args(0)
    val endTime: String = args(1)
    val dateFormat = new SimpleDateFormat("yyyy-MM-dd")
    val dateFiled: Int = Calendar.DAY_OF_MONTH


    var beginDate = dateFormat.parse(startTime)

    val endDate = dateFormat.parse(endTime)

    val calendar = Calendar.getInstance()

    calendar.setTime(beginDate)
    val str = Array("2017-01-27", "2017-07-15", "2017-10-14", "2017-12-02", "2017-09-24", "2017-10-05", "2017-07-01", "2017-10-06", "2017-07-22", "2017-04-09", "2017-07-09", "2017-06-24", "2017-08-05", "2017-05-20", "2017-12-24", "2017-11-18", "2017-10-22", "2017-05-06", "2017-07-29", "2017-01-28", "2017-05-30", "2017-05-21", "2017-11-04", "2017-01-14", "2017-01-15", "2017-01-07", "2017-03-04", "2017-06-04", "2017-06-17", "2017-07-02", "2017-07-16", "2017-06-25", "2017-05-07", "2017-01-31", "2017-01-30", "2017-10-29", "2017-01-21", "2017-03-12", "2017-04-30", "2017-06-11", "2017-01-02", "2017-02-05", "2017-09-10", "2017-10-07", "2017-12-10", "2017-03-25", "2017-10-01", "2017-04-15", "2017-07-23", "2017-03-11", "2017-02-25", "2017-03-05", "2017-08-13", "2017-12-09", "2017-10-21", "2017-05-14", "2017-02-11", "2017-02-18", "2017-10-08", "2017-05-01", "2017-04-03", "2017-05-13", "2017-11-12", "2017-04-22", "2017-05-28", "2017-11-26", "2017-11-11", "2017-12-17", "2017-08-27", "2017-09-17", "2017-07-08", "2017-09-09", "2017-10-03", "2017-02-12", "2017-08-12", "2017-04-23", "2017-12-30", "2017-12-31", "2017-03-19", "2017-11-25", "2017-03-18", "2017-02-02", "2017-12-16", "2017-06-03", "2017-11-19", "2017-10-15", "2017-10-04", "2017-04-16", "2017-03-26", "2017-01-29", "2017-02-26", "2017-06-18", "2017-06-10", "2017-01-01", "2017-02-01", "2017-04-08", "2017-10-02", "2017-08-26", "2017-10-28", "2017-08-20", "2017-12-03", "2017-09-16", "2017-04-02", "2017-02-19", "2017-04-29", "2017-05-29", "2017-09-02", "2017-08-06", "2017-08-19", "2017-01-08", "2017-11-05", "2017-09-23", "2017-12-23", "2017-07-30", "2017-09-03")

    val dateArray: ArrayBuffer[String] = ArrayBuffer()

    while (beginDate.compareTo(endDate) <= 0) {
      dateArray += dateFormat.format(beginDate)
      calendar.add(dateFiled, 1)
      beginDate = calendar.getTime
    }
    val ldate = dateArray.toList
//    for (v <- str)
    println(endDate)
    var de3: Int = ldate.size


    System.out.println("de3" + de3)
    import scala.collection.JavaConversions._
    for (date <- ldate) {
      val i: Int = 1
      // int de;
      for (v <- str) {
        if (dateFormat.parse(v) == dateFormat.parse(date)) {
          System.out.println("000:" + dateFormat.parse(date))
          de3-=i
        }

      }
      // System.out.println(i);
      //System.out.println(dateFormat.parse(date))
    }
    System.out.println(de3+"个工作日")


}
}

6.scala的udf函数

    //自定义函数计算工作日
    def udf(startTime: String, endTime: String) = {//-----------
      import java.text.SimpleDateFormat
      import java.util.Calendar
      val stringDateBegin: String = startTime
      val stringDateEnd: String = endTime
      val dateFormat = new SimpleDateFormat("yyyy-MM-dd")
      val dateFiled: Int = Calendar.DAY_OF_MONTH


      var beginDate = dateFormat.parse(stringDateBegin)

      val endDate = dateFormat.parse(stringDateEnd)

      val calendar = Calendar.getInstance()

      calendar.setTime(beginDate)
      val str = Array("2017-01-27", "2017-07-15", "2017-10-14", "2017-12-02", "2017-09-24", "2017-10-05", "2017-07-01", "2017-10-06", "2017-07-22", "2017-04-09", "2017-07-09", "2017-06-24", "2017-08-05", "2017-05-20", "2017-12-24", "2017-11-18", "2017-10-22", "2017-05-06", "2017-07-29", "2017-01-28", "2017-05-30", "2017-05-21", "2017-11-04", "2017-01-14", "2017-01-15", "2017-01-07", "2017-03-04", "2017-06-04", "2017-06-17", "2017-07-02", "2017-07-16", "2017-06-25", "2017-05-07", "2017-01-31", "2017-01-30", "2017-10-29", "2017-01-21", "2017-03-12", "2017-04-30", "2017-06-11", "2017-01-02", "2017-02-05", "2017-09-10", "2017-10-07", "2017-12-10", "2017-03-25", "2017-10-01", "2017-04-15", "2017-07-23", "2017-03-11", "2017-02-25", "2017-03-05", "2017-08-13", "2017-12-09", "2017-10-21", "2017-05-14", "2017-02-11", "2017-02-18", "2017-10-08", "2017-05-01", "2017-04-03", "2017-05-13", "2017-11-12", "2017-04-22", "2017-05-28", "2017-11-26", "2017-11-11", "2017-12-17", "2017-08-27", "2017-09-17", "2017-07-08", "2017-09-09", "2017-10-03", "2017-02-12", "2017-08-12", "2017-04-23", "2017-12-30", "2017-12-31", "2017-03-19", "2017-11-25", "2017-03-18", "2017-02-02", "2017-12-16", "2017-06-03", "2017-11-19", "2017-10-15", "2017-10-04", "2017-04-16", "2017-03-26", "2017-01-29", "2017-02-26", "2017-06-18", "2017-06-10", "2017-01-01", "2017-02-01", "2017-04-08", "2017-10-02", "2017-08-26", "2017-10-28", "2017-08-20", "2017-12-03", "2017-09-16", "2017-04-02", "2017-02-19", "2017-04-29", "2017-05-29", "2017-09-02", "2017-08-06", "2017-08-19", "2017-01-08", "2017-11-05", "2017-09-23", "2017-12-23", "2017-07-30", "2017-09-03")

      val dateArray: ArrayBuffer[String] = ArrayBuffer()

      while (beginDate.compareTo(endDate) <= 0) {
        dateArray += dateFormat.format(beginDate)
        calendar.add(dateFiled, 1)
        beginDate = calendar.getTime
      }
      val ldate = dateArray.toList
      //    for (v <- str)
      println(endDate)
      var de3: Int = ldate.size


      System.out.println("de3" + de3)
      for (date <- ldate) {
        val i: Int = 1
        // int de;
        for (v <- str) {
          if (dateFormat.parse(v) == dateFormat.parse(date)) {
            System.out.println("000:" + dateFormat.parse(date))
            de3 -= i
          }

        }
        // System.out.println(i);
        //System.out.println(dateFormat.parse(date))
      }
     // System.out.println(de3 + "个工作日")
      de3
    }
    spark.udf.register("udf",udf(_:String,_:String))

    //---------

    jdbcDF.createOrReplaceTempView("Node_Test")
    val Node_Test=spark.sql("select udf(START_TIME,END_TIME)gongzuori, START_TIME, END_TIME from Node_Test")
    //注册临时表
    Node_Test.show()
    Node_Test.write.mode(SaveMode.Overwrite).jdbc(url, "test.test3", prop)

 

创建表:

 1154107593Za7

版权声明:本文为kaiwen1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kaiwen1/p/8808629.html