摘要

项目中有个需求要求计算工作日天数的,于是写了段代码用于生成一年假日表,以辅助实现功能

思路:计算一个时间区间内工作日的天数,只要计算出这个时间区间的天数,再减去休息日的天数就可以了。但是有点麻烦的是休息日的统计,因为它不仅包括周末时间,还包括放假时间,放假还要考虑周末补班的,工作日放假休息的。

步骤:

1、把一年内的所有周末加入到假期表中。

2、把一年中所有的法定假期加入到假期表中(需等国务院公布,所以要一年跑一次维护假期表)。

3、把周末需要补班的日子从表中剔除掉。

上面还有一个细节就是法定假期里可能也有周末,所以插入前要检查避免重复插入。这样我们就得到了一张包括一年中所有假期的假期数据表了。具体实现代码如下,纯属能跑没仔细优化:

package com.util;
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 2016-1-15 下午6:06:11*/
public class InsertHolidayUtil {public static void main(String[] args){//驱动程序名String driver = "com.mysql.jdbc.Driver"; //要插入的数据库,表String url = "jdbc:mysql://127.0.0.1:3306/xx_web";  String user = "root"; String password = "123456";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("2016-01-01");//开始时间java.util.Date end = sdf.parse("2016-12-31");//结束时间List 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 (id,title,holiday_date) VALUES('"+UUID.randomUUID()+"',"+"'周末','"+sdf.format(date)+"')";statement.executeUpdate(insertSql);}}}//---------------插入节假日时间------------------List holidays = new ArrayList();holidays.add(new Days(UUID.randomUUID().toString(),"元旦", sdf.parse("2016-01-01")));holidays.add(new Days(UUID.randomUUID().toString(),"元旦", sdf.parse("2016-01-02")));holidays.add(new Days(UUID.randomUUID().toString(),"元旦", sdf.parse("2016-01-03")));holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2016-02-07")));holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2016-02-08")));holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2016-02-09")));holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2016-02-10")));holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2016-02-11")));holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2016-02-12")));holidays.add(new Days(UUID.randomUUID().toString(),"春节", sdf.parse("2016-02-13")));holidays.add(new Days(UUID.randomUUID().toString(),"清明节", sdf.parse("2016-04-02")));holidays.add(new Days(UUID.randomUUID().toString(),"清明节", sdf.parse("2016-04-03")));holidays.add(new Days(UUID.randomUUID().toString(),"清明节", sdf.parse("2016-04-04")));holidays.add(new Days(UUID.randomUUID().toString(),"劳动节", sdf.parse("2016-04-30")));holidays.add(new Days(UUID.randomUUID().toString(),"劳动节", sdf.parse("2016-05-01")));holidays.add(new Days(UUID.randomUUID().toString(),"劳动节", sdf.parse("2016-05-02")));holidays.add(new Days(UUID.randomUUID().toString(),"端午节", sdf.parse("2016-06-09")));holidays.add(new Days(UUID.randomUUID().toString(),"端午节", sdf.parse("2016-06-10")));holidays.add(new Days(UUID.randomUUID().toString(),"端午节", sdf.parse("2016-06-11")));holidays.add(new Days(UUID.randomUUID().toString(),"中秋节", sdf.parse("2016-09-15")));holidays.add(new Days(UUID.randomUUID().toString(),"中秋节", sdf.parse("2016-09-16")));holidays.add(new Days(UUID.randomUUID().toString(),"中秋节", sdf.parse("2016-09-17")));holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2016-10-01")));holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2016-10-02")));holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2016-10-03")));holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2016-10-04")));holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2016-10-05")));holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2016-10-06")));holidays.add(new Days(UUID.randomUUID().toString(),"国庆节", sdf.parse("2016-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 (id,title,holiday_date) VALUES('"+day.getId()+"',"+"'"+day.getTitle()+"','"+sdf.format(day.getDate())+"')";statement.executeUpdate(insertSql);}}//-------------- 剔除补班时间(周末需要补班的)---------------------List workDays = new ArrayList();workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2016-02-06")));workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2016-02-14")));workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2016-06-12")));workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2016-09-18")));workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2016-10-08")));workDays.add(new Days(UUID.randomUUID().toString(),"补班", sdf.parse("2016-10-09")));for(Days day:workDays) {System.out.println("剔除日期:" + sdf.format(day.getDate()) + "," + day.getTitle());String delSql = "delete from fn_all_holiday where holiday_date ='" + 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 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 dateList = new ArrayList();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.util;import java.util.Date;public class Days {private String id;private String title;private Date date;public Days(String id,String title,Date date) {this.id = id;this.title = title;this.date = date;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}}

java生成一年中假日表(包括周末和法定假期),用于计算一年中的工作日相关推荐

  1. java生成自己定义的表ID

    需生成例如以下ID: 56d7ade1-87d1-4f54-8dc8-13611c8c2545 27181ad4-4214-4e12-af3a-911a0103a12f 24cafdfb-eac3-4 ...

  2. JAVA生成UUID并作为数据库表的ID

    在接触UUID之前,我建表用的ID一直是用的int型,然后自动增长,这样很方便. 但是这样做却有一些问题,因为数据量大的话,不可能只用一张表,而是几张表,这样会出现id重复,于是有了UUID. UUI ...

  3. PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0),目前只能java生成】...

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个是<PoiDemo[Android将表单数据生成Word文档的方案之二(基于Poi4.0.0)]>的扩展,上一篇是根 ...

  4. java生成表_java生成表格图表

    项目有个需求是生成上图的表格图表,本来excel很容易生成上边的表格图,但是java poi不支持在服务器端把excel表格导出成图片,在没有找到合适的工具库下,用java 2d实现同样图表. 这个表 ...

  5. Help Manual Premium包括 Sandcastle 生成的代码示例表

    Help & Manual Premium包括 Sandcastle 生成的代码示例表 将 Sandcastle Tidy 添加到工具箱实用程序- 新的 Sandcastle Tidy 功能会 ...

  6. JAVA 生成数据表图标LOGO二维码

    JAVA 生成数据表图标LOGO二维码 private static final int QRCOLOR = 0xFF000000; // 默认是黑色private static final int ...

  7. [摘]用Java生成Word文档

    开发中隔三叉五的就要用到Word,经常被搞得不胜其烦,不过这次找到了不少好例子,干脆将他们都摘了过来,内容如下: 1. poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这 ...

  8. Java 生成各种 PDF 实战方案(图片、模板、表格)

    刚接到了一个需求,生成一个pdf,一开始以为挺简单的,通过模板生成嘛,我也发过相应的文章,根据模板直接生成pdf,响应到前端或者根据模板生成pdf,直接指定下载位置,这两种方案都可以,不过这篇文章主要 ...

  9. 用java生成word文档(转载)

    用java生成word文档 poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: 下载经过封装后的poi包: 这个包就是:tm-extrac ...

  10. java生成 excel 并导出文件

    给大家介绍一个代码在线自动生成的网站:www.5ceo.cn 技术之家    或者加qq群: 527796869 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和J ...

最新文章

  1. qq无限时间撤回消息bug_手机QQ新功能汇总,比微信有意思多了
  2. Java的List排序
  3. Linux内存映射mmap原理分析
  4. 自动化测试 div sendkeys无效_【自动化测试】【JestSelenium】(04)—— Selenium WebDriver...
  5. 用Python爬取Bilibili上二次元妹子的视频
  6. (十七)java版spring cloud+spring boot 社交电子商务平台-spring+springmvc+kafka分布式消息中间件集成方案...
  7. 清华大学-美团数字生活联合研究院成立
  8. 使textarea支持tab缩进
  9. linux 删除已输入的命令
  10. 【Zookeeper学习】Apache Zookeeper项目简介
  11. sql语句分析是否走索引_Mysql中SQL语句不使用索引的情况
  12. 苹果6代掉水里怎么办 iPhone6掉水处理方法
  13. OTSU 获取最佳阈值,及opencv二值化
  14. 后台数据联调的接口工具 postman和apizza 集成数据
  15. java fileupload_java组件fileupload
  16. oracle10g的系统视图(sys、system)
  17. %appdata% 代表什么?
  18. 重磅干货:30张图读懂当前中国金融体系!
  19. Java中notify() 和 notifyAll()的区别
  20. 【linux】循序渐进学运维-基础篇-mount

热门文章

  1. G31主板支持1440*900分辨率
  2. Weka的全名是怀卡托智能分析环境
  3. JS 最新版身份证格式验证
  4. 35岁之前不应该错过的30本书
  5. 单页面网站优化技巧有哪些?
  6. 机动车尾气排放模型综述
  7. Android下载多张图片保存到本地
  8. Vulkan Cookbook 第七章 1 将GLSL着色器转换为SPIR-V组件
  9. vue 引入字体文件
  10. 1. VCS仿真原理——当我们谈论simv时,我们在谈论什么