在做项目时遇到一个需求,需要计算两个时间点之间的工作日。便于统计项目时间统计。
其中有两个方向:
第一,调用开源的api,“http://api.goseek.cn/Tools/holiday?date={时间}”,这个api会返回:工作日:0;节假日:1;工作日:2),然后根据返回的数据进行判断,当然这个会受到网络和别人api的限制,但是好处是我们不用去维护节假日,因为这个是国务院每年发布,我们自己要维护的话很繁琐。
第二,将本年的节假日存在数据库中,然后对两个日期之间进行逻辑操作,当然这个就很繁琐,维护成本大一点,本来就是一个小东西,这个直接从数据库拿对于效率来说就要高一点了。
我选择的是第一种,方便嘛。然后对其中的方法进行重构,看起来爽一点,下面是代码,当然是第一版,有bug请联系我,后面测试我也会补充。

package com.xiaowei.worksystem.utils;import com.alibaba.fastjson.JSONObject;
import sun.net.www.protocol.http.HttpURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;public class WorkdayCalculationUtils {private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");/** 传入查询工作日api地址,用于查询当天是否是工作日,返回的是JSON格式的数据,需要在代码中进行转换。* */public static  String getData(String addess){URL url = null;HttpURLConnection httpConn = null;BufferedReader in = null;StringBuffer sb = new StringBuffer();try{url = new URL(addess);in = new BufferedReader(new InputStreamReader(url.openStream(),"utf-8") );String str = null;while((str = in.readLine()) != null) {sb.append( str );}} catch (Exception ex) {ex.printStackTrace();} finally{try{if(in!=null) {in.close();}}catch(IOException ex) {ex.printStackTrace();}}String  data =sb.toString();return data;}/*** 两个日期相减* @param beginDateStr* @param endDateStr* @return*/public static long getDaySub(String beginDateStr,String endDateStr){long day=0;SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");Date beginDate;Date endDate;try{beginDate = format.parse(beginDateStr);endDate= format.parse(endDateStr);day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);//System.out.println("相隔的天数="+day);} catch (ParseException e){// TODO 自动生成 catch 块e.printStackTrace();}return day+1;}/** 计算两个时间点的工作日** */public static long getWorkDayBetweenStartAndEnd(String startTime,String endTime) throws ParseException {//工作日long workDay=0;//先算出两个时间中间的天数long dayOfMiddle=getDaySub(startTime,endTime);//从开始时间起,算出中间的周末和及假日for(int i=0;i<dayOfMiddle;i++){Date now=sdf.parse(startTime);Calendar c = Calendar.getInstance();c.setTime(now);c.set(Calendar.DATE, c.get(Calendar.DATE) + i);String urlData= sdf.format(c.getTime());String  urlDress= "http://api.goseek.cn/Tools/holiday?date="+urlData;//获得当前是否是工作日String data=getData(urlDress);JSONObject json =  getjson(data);String value=json.get("data").toString();if(value.equals("0")){workDay++;}}return workDay;}//json串转化为json对象public static JSONObject getjson(String data) {JSONObject json = JSONObject.parseObject(data);return json;}
}

Java计算两个时间点的工作日相关推荐

  1. 使用Java的Calendar类计算两段时间之间的工作日的天/小时/分钟/秒数

    计算两段时间之间的工作日的天/小时/分钟/秒数 我们能经常遇到一些需求,让获取工作日的时间(当然,调休也上班也是工作日哈!),之前自己给这搞得头大,所以整理总结,把该工具类记录下来,希望大家能用到的时 ...

  2. 计算两个时间相差的工作日(附带查询api接口)

    /*** 两个日期相减* @param beginDateStr* @param endDateStr* @return*/ public static long getDaySub(String b ...

  3. java如何计算时间天数差,java计算两个时间相差天数的方法汇总

    问题描述: 输入:两个日期 输出:两个日期相差的天数 具体代码实现 方法1: 通过calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 年份是 ...

  4. Java计算两个时间段内的工作日天数

    一般在OA系统中都会遇到计算员工这段时间内的工作天数. 这种有两种方式可以解决:一是调用第三方服务接口进行计算,二是自己在系统中写代码计算. 一的好处就是每年的节假日不用自己去维护直接用两个时间段就可 ...

  5. Java计算两个时间的小时差

    /**** 计算两段时间的小时差* @module* @author SJT* @date 2022/12/28* @param startTime* @param endTime* @return: ...

  6. java 计算两个时间之间的间隔

    1. 怎样计算两个时间之间的间隔? 间隔=Date1.getTime()-Date2.getTime();得出来的是毫秒数. 除1000是秒,再除60是分,再除60是小时............... ...

  7. java计算两个时间相差几个月

    //计算两个时间相差几个月public int getMonth(Date start, Date end) {if (start.after(end)) {Date t = start;start ...

  8. Java计算两个时间的月份差值

    普通的写逻辑去判断两个时间相差月份需要写很多逻辑判断,比如年份比较,那么有什么办法可以快速计算呢? 引入依赖: <dependency><groupId>joda-time&l ...

  9. java计算两个时间相差天数的方法

    方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 年份是分闰年和平年的,各自的天数不同 /**  * date2比date1 ...

最新文章

  1. 软件工程实训有必要吗_人工智能专业值得读吗?就业如何?
  2. 生物信息学常见数据格式 • fasta • fastq • gff/gtf 练习题
  3. 收藏 | 数据智能与计算机图形学领域2019推荐论文列表(附链接)
  4. TOMCAT startup.bat
  5. linux内核亲和性,Linux中CPU亲和性(go)
  6. 服务器的虚拟主机用途,服务器的虚拟主机用途
  7. 穷举法破解集合小游戏~
  8. 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)
  9. STM32驱动LCD原理
  10. BeanUtils工具类
  11. primitive types
  12. keepalived做nginx的高可用,企业版简单介绍。
  13. 计算机科目三教学设计,驾校科目三教案
  14. Shared_ptr循环引用解决(weak_ptr的作用)
  15. 揭秘全美第一黑客组织Anonymous(匿名者)的装备库
  16. Mac屏保不生效问题的解决
  17. android 网易新闻 登录界面,Android实现仿网易新闻主界面设计
  18. [转]NSIS常用代码整理
  19. 查看、修改 nginx分布服务器ip
  20. Labview串口通信中ASCII码和数值相互转换

热门文章

  1. 【微信H5】分享出去是链接,不是卡片的原因及解决方案
  2. 16进制格式的字符串怎样转换为整数
  3. 编程的技术|艺术|术术——面向开发者编程
  4. finereport 激活码
  5. 微信支付调用第三方系统无返回值的问题
  6. 解决docker报错:The container name “/mysql“ is already in use by container
  7. 终于有人来盘一盘安卓ASO技巧了,安卓市场aso优化技巧
  8. 【教程】应用侧连接华为云IoT平台
  9. SpringBoot 项目文件上传过大报错不返回解决方案
  10. Android应用主界面底部菜单实现