请假时间计算(支持任何时间段)

本文介绍了如何根据业务需求计算请假时长,考虑了节假日、双休、调休、午休等因素。通过两个工具类的配合,实现了2019全年请假时间计算,对于其他年份,需要额外录入数据。
摘要由CSDN通过智能技术生成

因为业务需求,要对请假时间进行计算,也就是用户选定一个开始时间,在选定一个结束时间,你要给用户展示一个他请假的时长,这个时长肯定是除开节假日,双休,其中考虑到放假后的调休,中午午休,以及用户提交请假所处的时间段。
翻了翻网上的一些带佬的代码(毕竟码农的精华就在CV嘛),恩,有重合部分,但无法完全满足业务需求,所以还是需要自己动手做部分整合,最关键是部分代码需要调用外部接口,也把整合的代码放出。

第一个工具类:

package com.api.leave.utils;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
  * 请假计算(小时)
  * 1.除去 节假日
  * 2.除去 其他规定的 非工作时间(有具体的  实行者指定)
  * 3.考虑一点 其他不上班时间 有些公司的特别
  * @author fengjing
  *
  */
public class HolidayDateUtil {

/**
 * 节假日查询接口
 * 使用方法 url+yyyyMMdd
 */


//时间格式化
public final static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public final static SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");

/**
 * 从公认网站上获取 节假日信息
 * @param url 获取节假日的 公认网站 url="网站地址"+时间 时间格式yyyyMMdd
 * @param url
 * @return 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2, 网站失效-1, 数据格式改变-2
 */
public static String getHoliday(String date) {
    ChineseCalendarUtils cc = new ChineseCalendarUtils();
    try {
        return cc.checkDate(date);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 判断某年某月有多少天
 * @param year 年  "yyyy"
 * @param moun 月 "m"
 * @return
 */
public static int daysMonth(int year,int moun){
    switch(moun){
        case 0: return 31;
        case 1: return ((year%4==0&&year%100!=0)||year%400==0)?29:28;
        case 2: return 31;
        case 3: return 30;
        case 4: return 31;
        case 5: return 30;
        case 6: return 31;
        case 7: return 31;
        case 8: return 30;
        case 9: return 31;
        case 10: return 30;
        case 11: return 31;
        default: return 0;
    }
}
/**
 * 通过时间秒毫秒数判断两个时间的间隔
 * @param tiny 开始时间
 * @param large结束时间
 * @return 返回几天
 */
public static int differentDaysByMillisecond(Date tiny,Date large){
    if(format1.format(tiny).equals(format1.format(large))){
        return 0;
    }
    Calendar c1 = Calendar.getInstance();
    Calendar c2 = Calendar.getInstance();
    c1.setTime(tiny);
    c2.setTime(large);
    int result = c2.get(Calendar.DAY_OF_YEAR) - c1.get(Calendar.DAY_OF_YEAR);
    /*Double why = Double.valueOf((large.getTime() - tiny.getTime()))/(1000*3600*24);
    double d = Math.ceil(why);*/
    return result;
}

/**
 * 通过时间秒毫秒数判断两个时间的间隔
 * @param tiny 开始时间
 * @param large结束时间
 * @return 返回几小时
 */
public static double differentHoursByMillisecond(Date tiny,Date large){
    double hours = ((double) ((large.getTime() - tiny.getTime())) / (1000*3600));
    return hours;
}

/**
 * 时间格式yyyy-MM-dd HH:mm:ss
 * @param start 请假开始时间 yyyy-MM-dd HH:mm:ss
 * @param end 请假结束时间 yyyy-MM-dd HH:mm:ss
 * @param startM 上班早晨开始时间 HH:mm:ss
 * @param endE   上班早晨结束时间 HH:mm:ss
 * @param startAf 上班下午开始时间 HH:mm:ss
 * @param endAf      上班下午结束时间 HH:mm:ss
 * @return
 */
public double calculateTimeHour(String start,String end,String startM,String endE,String startAf,String endAf){
    if(start!=null&&end!=null&&startM!=null&&endE!=null&&startAf!=null&&endAf!=null){//确保时间格式正确和值存在
        try {
            Date dataStart = HolidayDateUtil.format.parse(start);
            Date dataEnd = HolidayDateUtil.format.parse(end);

            double hours = 0;
            int monthDays = -1;
            int yearTime = dataStart.getYear()+1900;
            int mounthTime = dataStart.getMonth();
            int dataTime = dataStart.getDate();

            double lunchBreak;
            int interval = HolidayDateUtil.differentDaysByMillisecond(dataStart,dataEnd);

            //判断这年这
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值