java工作日和节假日判断

Lovnx Lovnx     2022-12-03     590

关键词:

最近公司有个业务需要判断工作日,但是每年的节假日不一样,且不说周末、法定节假日这些,有些公司还有自己的节假日,这样就很难写出一劳永逸的方法来实现了。
其实我们可以借助数据库来实现这个功能,可以把每年的节假日或者工作日存储到数据库中,再用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 header
            connection.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判断当前日期是节假日还是工作日

你好,这个功能一般是使用一个专门的数据库表把一年的节假日都存进去来判断的。国家每年都会提前发布一年的节假日,然后我们再导入到数据库。而特殊的做法应该可以接入百度之类的接口。希望能帮到你。参考技术A你好... 查看详情

java判断股市是不是休市

通过代码来判断股市是否休市。参考技术A每个工作日上午9点半开盘,下午3点收盘嘛,周末或法定节假日全天休市,java获取个Date判断时间而已,再结合法定节假日表,就解决了。好像证券交易所有开放WebService的,直接调用就可... 查看详情

最简单判断工作日/节假日api(代码片段)

   由于开发的系统需要根据工作日和节假日来进行逻辑判断,所以这里研究了下方案:1.自己维护一份日历表,把每天的日期类型标注清楚    之前的一家公司就是这样解决的,需要每年去手动更新。如果公司... 查看详情

java实现判断休息日和节假日

1需求周末和节假日推送消息,或者不打扰某些人,定时任务过滤掉某些节假日休息日.最笨的方案就是都把节日提前存储好几个月的,然后到期同步一次.2选型方案2.1.网络接口:聚合平台:https://www.juhe.cn/docs/api/id/177/aid/6011.打开找... 查看详情

最简单判断工作日/节假日api(代码片段)

   由于开发的系统需要根据工作日和节假日来进行逻辑判断,所以这里研究了下方案:1.自己维护一份日历表,把每天的日期类型标注清楚    之前的一家公司就是这样解决的,需要每年去手动更新。如果公司... 查看详情

最简单判断工作日/节假日api(代码片段)

   由于开发的系统需要根据工作日和节假日来进行逻辑判断,所以这里研究了下方案:1.自己维护一份日历表,把每天的日期类型标注清楚    之前的一家公司就是这样解决的,需要每年去手动更新。如果公司... 查看详情

moment.js能判断是不是为节假日吗

...断是否为节假日。使用Moment.js查找日期(不包括假日),计算工作日,但最终日期不能为周末。 参考技术Bmoment.js能判断是否为节假日吗:判断日期是否节假日判断节假日有阳历的日期也有阴历的日期所以要获得两个日期加以判断。 查看详情

java如何判断日期是否节假日

没有此方法,只能判断是星期几。因为中国的节假日是农历!而java不是中国人搞出来的!。参考技术A如果单单为了这点需求做一个农历和阳历结合的判定太复杂了我觉得把农历的节日日期配置一下比较方便如下这个网址是这么... 查看详情

java工作日计算工具类(代码片段)

工作日计算工具类主要功能:传入两个日期,返回这两个日期之间有多少个工作日。思路:先预设值好START_YEAR-END_YEAR年份范围内的节假日、补休保存到map;然后遍历这个年份范围内的每一天,如果在map里找到相应数据,则以map... 查看详情

java——获取n个工作日后的日期(这里只除去周末)(代码片段)

我这里是个简单版的,只是去除周末,对于节假日无法自动掌控,需要配置节假日表,因为中国的节假日是每年定一次。可以参考:获取n个工作后的日期,排除节假日和调休我的简单版代码如下: publi... 查看详情

java——获取n个工作日后的日期(这里只除去周末)(代码片段)

我这里是个简单版的,只是去除周末,对于节假日无法自动掌控,需要配置节假日表,因为中国的节假日是每年定一次。可以参考:获取n个工作后的日期,排除节假日和调休我的简单版代码如下: publi... 查看详情

在 WooCommerce 中的 jQuery datepicker 问题中禁用工作日和节假日

】在WooCommerce中的jQuerydatepicker问题中禁用工作日和节假日【英文标题】:DisableweekdaysandholidaysinjQuerydatepickerissueinWooCommerce【发布时间】:2018-07-0615:16:07【问题描述】:我有一个使用jQuery-uidatepicker的自定义woocommerce过滤器功能。我... 查看详情

计算两个日期之间的工作日(去掉周末和节假日)

1packagecom.utouu.uphone.commons;23importjava.text.ParseException;4importjava.text.SimpleDateFormat;5importjava.util.ArrayList;6importjava.util.Calendar;7importjava.util.Date;8importjava.util.Iterator 查看详情

java——获取n个工作日后的日期(这里只除去周末)(代码片段)

我这里是个简单版的,只是去除周末,对于节假日无法自动掌控,需要配置节假日表,因为中国的节假日是每年定一次。可以参考:获取n个工作后的日期,排除节假日和调休我的简单版代码如下: publi... 查看详情

sqlserver向表中添加工作日,不排除节假日,只排出星期六星期日

--创建表createtableWeekDays(idintprimarykeyidentity(1,1),WeekDaynvarchar(20),Statusint--判断是否启用)----添加一年的工作日DECLARE@numintDECLARE@countintset@num=1set@count=1WHILE@num<=365--时间跨度有闰年的就是366天beginINSERTin 查看详情

java时间小工具

 /***获取当月的工作日(国家规定补班的无法分辨,仅限周末和国家规定节假日除外)*@authorxujinbo*/publicclassWorkDaysUtil  publicstatic List<Date>getWorkDates(intyear,intmonth)    List<Date&g 查看详情

itsm常见问题之:如何有效处理非工作时间和节假日发生的事件

...一个专门的技术组负责处理此类安全事件,但是由于是非工作日,技术员很可能错过该工单,当技术员上班注意到此工单时,可能已经晚了。下面是两个简单的过程,了解如何在ServiceDeskPlus中应对这种问题。创建一个随时执行的... 查看详情

工作日计算问题思路和实现

...日,给定查询起始日期和结束日期,推导出查询时间段内工作日是多少。为了简化这个问题,须要以下几个如果。1.不考虑周六周日,将其视作普通工作日2.假日没有交叠情况。不会出现10月1日到7日是国庆节,当中又有一个其他... 查看详情