最近公司有个业务需要判断工作日,但是每年的节假日不一样,且不说周末、法定节假日这些,有些公司还有自己的节假日,这样就很难写出一劳永逸的方法来实现了。
其实我们可以借助数据库来实现这个功能,可以把每年的节假日或者工作日存储到数据库中,再用sql查询出两个日期之间的节假日或者工作日来,计算数量,就可以实现了,后期也方便维护,可以根据需要手动添加一些特殊节假日。

这次需要用到百度API集市的一款接口,检查具体日期是否为节假日,工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2;
支持 2009 年起至最新 中国法定节假日,以国务院发布的公告为准,随时调整及增加;
参数可以以 GET 或 POST 方式传递,以 JSON 格式返回结果。
JSON返回示例 :{“20130101”:2,”20130103”:2,”20130105”:”0”,”20130201”:”0”}
由于API响应速度比较慢,采用数据库来存储节假日或者工作日,这样调用就快很多了,只需要初始化插入数据就行了。

下面是一个具体实例:(以工作日计算举例,数据库用的mysql)

工程结构:

建表sql:

CREATE TABLE `workday` (`id` INT(11) NOT NULL AUTO_INCREMENT,`workday` DATE DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

DBConn:

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 = "1992115";  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();  }  }
}  

DateAPI(核心类):

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;/*** * @ClassName:DateAPI* @Description:当前年 的节假日 查询 工具类* @author Lovnx* @qq 930999349* @date 2016-8-5 上午10:08:44*/public class DateAPI {public List<String> getWorkDays()throws Exception {List<String> list = new ArrayList<String>();Calendar a = Calendar.getInstance();String httpUrl = "http://apis.baidu.com/xiaogg/holiday/holiday";String t = a.get(Calendar.YEAR) + "0101";// 开始的日期SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");SimpleDateFormat sdfDateFormat = new SimpleDateFormat("yyyy-MM-dd");Calendar calendar = Calendar.getInstance();// 开始日期,并要累积加 一Calendar calendar2 = Calendar.getInstance();// 结束的日期Date time = sdf.parse(t);calendar.setTime(time);calendar2.setTime(time);calendar2.add(Calendar.YEAR, 1);// 加上一年的后的日期Date first = calendar.getTime();Date next = calendar2.getTime();while (first.getTime() < next.getTime()) { // 判断是否是节假日String fdate = "d=" + sdf.format(first.getTime());String jsonResult = request(httpUrl, fdate);// 判断是否是节假日if ("0".equals(jsonResult.trim())) {list.add(sdfDateFormat.format(first.getTime()));}calendar.add(calendar.DATE, 1);// 把日期往后增加一天.整数往后推,负数往前移动first = calendar.getTime(); // 这个时间就是日期往后推一天的结果calendar.getTime();}return list;}/*** @param urlAll :请求接口* @param httpArg :参数* @return 返回结果*/public String request(String httpUrl, String httpArg) {BufferedReader reader = null;String result = null;StringBuffer sbf = new StringBuffer();httpUrl = httpUrl + "?" + httpArg;try {URL url = new URL(httpUrl);HttpURLConnection connection = (HttpURLConnection)url.openConnection();connection.setRequestMethod("GET");// 填入apikey到HTTP headerconnection.setRequestProperty("apikey", "abfa5282a89706affd2e4ad6651c9648");connection.connect();InputStream is = connection.getInputStream();reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));String strRead = null;while ((strRead = reader.readLine()) != null) {sbf.append(strRead);sbf.append("\r\n");}reader.close();result = sbf.toString();} catch (Exception e) {e.printStackTrace();}return result;}
}

DAO:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DAO {public int workdayAdd(Connection con,String date)throws SQLException{String sql = "insert into workday values (null,?)";PreparedStatement pstmt = con.prepareStatement(sql);pstmt.setString(1, date);return pstmt.executeUpdate();}public ResultSet countWorkday(Connection con, String beginDay,String endDay) throws Exception {StringBuffer sb = new StringBuffer("SELECT COUNT(w.id) - 2 FROM workday w WHERE w.workday BETWEEN '"+beginDay+"' AND '"+endDay+"'");PreparedStatement pstmt = con.prepareStatement(sb.toString());return pstmt.executeQuery();}
}

test:

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.List;public class test {public static void main(String[] args) throws Exception {DBConn dbConn = new DBConn();Connection con = dbConn.Conn();DAO dao = new DAO();DateAPI dateAPI = new DateAPI();//向工作日表插入数据,初始化时打开注释/*List<String> list= dateAPI.getWorkDays();for (String string : list) {dao.workdayAdd(con, string);}*/ResultSet rst = dao.countWorkday(con, "2016-1-4", "2016-1-7");if (rst.next()) {System.out.println("中间间隔工作日天数为:"+rst.getInt(1));}dbConn.close();}}

效果:

建议:
1、可以设置Spring定时任务每年跑一次,数据更准确。
2、可后期自行添加节假日。

java工作日和节假日判断相关推荐

  1. 节假日判断工具(Java)

    由来 节假日判断工具类:大厂接口要收费,小厂接口怕不稳定,索性自己写一个吧. 软件架构 spring boot,jdk1.8 原理:通过文本文件,维护每一年的假节日和调休日期.示例见/years/20 ...

  2. python 节假日_python判断工作日,节假日

    python判断工作日,节假日 发布时间:2020-09-07 09:37:20编辑:admin阅读(1017) 一.概述 最近在做数据分析,需要判断一个日期是否为工作日,节假日. 找到一个现成的插件 ...

  3. java获取法定节假日_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...

  4. php 计算时间段内的工作日 与节假日

    计算方法是取开始时间后的第一个星期一,如果结束时间大于等这一天则用第一个星期一至结束时间的时间的间隔取整周数与余数计算工作日与周末,再加上第一个周一前一周的工作日与节假日. /** 计算时间段内的工作 ...

  5. java虚拟机如何判断两个类相同_你有没有想过: Java 虚拟机是如何判断两个对象是否相同的?判断的流程是什么?...

    在Java程序运行时,会产生那么多的对象,那 Java 虚拟机是如何判断两个对象是否相同的呢?判断的流程是什么? 参考解答: Java 虚拟机会先判断两个对象的hashCode是否相同,如果hashC ...

  6. 【Java】奇偶数判断

    [Java]奇偶数判断 需求 编写方法,判断一个数是奇数还是偶数 代码 package com.cxl.demo27;import java.util.Scanner;//奇偶数判断 public c ...

  7. Pandas 日期处理:生成及去除工作日与节假日

    Pandas 日期处理:生成工作日与节假日

  8. iPhone自动设置工作日和节假日闹钟

    iPhone自动设置工作日和节假日闹钟 原理 步骤 编辑自动化的详细步骤 版本 修改说明 日期 1.0 创建 2022-05-09 2.0 修改type值获取bug 2022-05-14 3.0 制作 ...

  9. java判断是否安装了pdf_java判断上传文件是否为pdf java图像上传中如何判断是否是jpg格式...

    java怎么判断有没有上传文件 Java平台如何判断用户上传的文件是否是图片不要辜负了自己受过的苦难,这样善良又努力的一个你,一定会得到曾梦寐以分享的所有美好. if(typeof FileReade ...

  10. java 布尔值的判断

    java 布尔值的判断 不要用 if(flag == true)这种写法 容易写成 if(flag = true), 直接if(flag)

最新文章

  1. 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)
  2. 编译libav(ffmpeg)库
  3. apiCloud中Frame框的操作,显示与隐藏Frame
  4. 坑爹的水题之“元芳你怎么看”
  5. Lua中的操作系统库
  6. 盖茨转让18亿美元股票给梅琳达,被传有85后新欢?当事人回应...
  7. 责任分配矩阵和raci的区别_PyTorch学习笔记——repeat()和expand()区别
  8. ajax-》post
  9. 编译用于高放射性环境的应用程序
  10. WAP PUSH解析(1)——SMS PDU编码
  11. Github hosts修改
  12. 制作精美失落美女胶片效果
  13. 超级爆笑学生作文大全
  14. 5分钟学会Linux上传文件和下载文件命令
  15. 矩阵理论及其应用课后习题作业:第五章 第六章
  16. 郑州师范学院计算机实验室,郑州师范学院---VR虚拟仿真实验中心
  17. The App Launch Cycle
  18. 基于RFID技术智慧工厂智能仓储管理平台解决方案
  19. Lua语言中的冒号:和点.
  20. 高性能 HTTP 负载测试工具 Vegeta

热门文章

  1. 目标检测中的边界框(x,y,w,h形式转换与绘制)
  2. 谷粒商城高级篇(39)——认证服务之验证码注册
  3. java扫码枪键盘_JAVA读取USB扫描枪
  4. MySQL查询效率问题
  5. 微信小程序实现刷脸登录
  6. 企业物流管理与最新IT技术
  7. (二)java项目中的文档转换案例实战——PDF转换为JPG图片压缩包
  8. Qt 图片自适应QLabel大小
  9. 打印机服务器找不到网络路径,分享0x80070035找不到网络路径的解决方法
  10. 计算机仿真实验碰撞实验原理,车辆正面碰撞中的耐撞性能仿真分析