java-怎么排除两个日期之间的节假日,下面我这个是计算排除周末的工作时间,怎么把节假日排除掉,求指教

问题描述

怎么排除两个日期之间的节假日,下面我这个是计算排除周末的工作时间,怎么把节假日排除掉,求指教

package server;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CalculateHours {

SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); //这里的格式可以自己设置 

//设置上班时间:该处时间可以根据实际情况进行调整
int abh = 9;//上午上班时间,小时
int abm = 00;//上午上班时间,分钟
int aeh = 12;//上午下班时间,小时
int aem = 0;//上午下班时间,分钟
int pbh = 13;//下午上班时间,小时
int pbm = 00;//下午上班时间,分钟
int peh = 18;//下午下班时间,小时
int pem = 0;//下午下班时间,分钟
float h1 = abh+(float)abm/60;
float h2 = aeh+(float)aem/60;
float h3 = pbh+(float)pbm/60;
float h4 = peh+(float)pem/60;
float hoursPerDay = h2-h1+(h4-h3);//每天上班小时数
int daysPerWeek = 6;//每周工作天数
long milsecPerDay = 1000*60*60*24;//每天的毫秒数
float hoursPerWeek = hoursPerDay*daysPerWeek;//每星期小时数
public float calculateHours(String beginTime, String endTime){
    System.out.println("设置的上班时间为:"+abh+":"+abm+"-"+aeh+":"+aem
            +"   "+pbh+":"+pbm+"-"+peh+":"+pem);
    System.out.println("每天工作时间为:"+hoursPerDay+"小时");
    //对输入的字符串形式的时间进行转换
    Date t1 = stringToDate(beginTime);//真实开始时间
    Date t2 = stringToDate(endTime);//真实结束时间
    System.out.println("设置的开始时间为:"+printDate(t1));
    System.out.println("设置的结束时间为:"+printDate(t2));
    //对时间进行预处理
    t1 = processBeginTime(t1);
    t2 = processEndTime(t2);
    System.out.println("预处理后的开始时间为:"+printDate(t1));
    System.out.println("预处理后的结束时间为:"+printDate(t2));
    //若开始时间晚于结束时间,返回0
    if(t1.getTime()>t2.getTime()){
        System.out.println("总工作时间为:0小时");
        return 0;
    }
    //开始时间到结束时间的完整星期数
    int weekCount = (int) ((t2.getTime()-t1.getTime())/(milsecPerDay*7));
    System.out.println("时间间隔内共包含了"+weekCount+"个完整的星期");
    float totalHours = 0;
    totalHours += weekCount * hoursPerWeek;
    //调整结束时间,使开始时间和结束时间在一个星期的周期之内
    t2.setTime(t2.getTime()-weekCount*7*milsecPerDay);
    System.out.println("结束时间调整为:"+printDate(t2));
    int dayCounts = 0;//记录开始时间和结束时间之间工作日天数
    //调整开始时间,使得开始时间和结束时间在同一天,或者相邻的工作日内。
    while(t1.getTime()<=t2.getTime()){
        Date temp = new Date(t1.getTime()+milsecPerDay);
        temp = processBeginTime(temp);
        temp.setHours(t1.getHours());
        temp.setMinutes(t1.getMinutes());
        if(temp.getTime()>t2.getTime()){
            break;
        }else{
            t1 = temp;
            dayCounts++;
        }
    }
    System.out.println("开始时间向后移动了"+dayCounts+"个工作日");
    System.out.println("开始时间调整为:"+printDate(t1));
    totalHours += dayCounts * hoursPerDay;
    float hh1 = t1.getHours() + (float)t1.getMinutes()/60;
    float hh2 = t2.getHours() + (float)t2.getMinutes()/60;
    //处理开始结束是同一天的情况
    if(t1.getDay()==t2.getDay()){
        float tt = 0;
        tt = hh2 - hh1;
        if(hh1>=h1&&hh1<=h2&&hh2>=h3){
            tt = tt - (h3-h2);
        }
        totalHours += tt;
    }else{
        //处理开始结束不是同一天的情况
        float tt1 = h4 - hh1;
        float tt2 = hh2 - h1;
        if(hh1<=h2){
            tt1 = tt1 - (h3-h2);
        }
        if(hh2>=h3){
            tt2 = tt2 - (h3-h2);
        }
        totalHours += (tt1 + tt2);
    }
    System.out.println("总工作时间为:"+totalHours+"小时");
    return totalHours;
}

/**
 * 格式化输出时间: yyyy-mm-dd hh:mm:ss 星期x
 * @param t
 * @return
 */
private String printDate(Date t) {
    String str;
    String xingqi = null;
    switch (t.getDay()) {
    case 0:
        xingqi = "星期天";
        break;
    case 1:
        xingqi = "星期一";
        break;
    case 2:
        xingqi = "星期二";
        break;
    case 3:
        xingqi = "星期三";
        break;
    case 4:
        xingqi = "星期四";
        break;
    case 5:
        xingqi = "星期五";
        break;
    case 6:
        xingqi = "星期六";
        break;
    default:
        break;
    }
    str = format.format(t)+"  "+xingqi;
    return str;
}

/**
 * 对结束时间进行预处理,使其处于工作日内的工作时间段内
 * @param t
 * @return
 */
private Date processEndTime(Date t) {
    float h = t.getHours() + (float)t.getMinutes()/60;
    //若结束时间晚于下午下班时间,将其设置为下午下班时间
    if(h>=h4){
        t.setHours(peh);
        t.setMinutes(pem);
    }else {
        //若结束时间介于中午休息时间,那么设置为上午下班时间
        if(h>=h2&&h<=h3){
            t.setHours(aeh);
            t.setMinutes(aem);
        }else{
            //若结束时间早于上午上班时间,日期向前推一天,并将时间设置为下午下班时间
            if(t.getHours()<=h1){
                t.setTime(t.getTime()-milsecPerDay);
                t.setHours(peh);
                t.setMinutes(pem);
            }
        }
    }
    //若结束时间是周末,那么将结束时间向前推移到最近的工作日的下午下班时间
    if(t.getDay()==0){
        t.setTime(t.getTime()-milsecPerDay*(t.getDay()==6?1:2));
        t.setHours(peh);
        t.setMinutes(pem);
    }
    return t;
}

/**
 * 对开始时间进行预处理
 * @param t1
 * @return
 */
private Date processBeginTime(Date t) {
    float h = t.getHours() + (float)t.getMinutes()/60;
    //若开始时间晚于下午下班时间,将开始时间向后推一天
    if(h>=h4){
        t.setTime(t.getTime()+milsecPerDay);
        t.setHours(abh);
        t.setMinutes(abm);
    }else {
        //若开始时间介于中午休息时间,那么设置为下午上班时间
        if(h>=h2&&h<=h3){
            t.setHours(pbh);
            t.setMinutes(pbm);
        }else{
            //若开始时间早于上午上班时间,将hour设置为上午上班时间
            if(t.getHours()<=h1){
                t.setHours(abh);
                t.setMinutes(abm);
            }
        }
    }
    //若开始时间是周末,那么将开始时间向后推移到最近的工作日的上午上班时间
    if(t.getDay()==0){
        t.setTime(t.getTime()+milsecPerDay*(t.getDay()==6?2:1));
        t.setHours(abh);
        t.setMinutes(abm);
    }
    return t;
}

/**
 * 将字符串形式的时间转换成Date形式的时间
 * @param time
 * @return
 */
private Date stringToDate(String time){
    try {
        return format.parse(time);
    } catch (ParseException e) {
        e.printStackTrace();
        return null;
    }
}
public static void main(String[] args) {
    String beginTime = "2015-08-28 10:00:00";
    String endTime = "2015-08-31 13:30:00";
    CalculateHours ch = new CalculateHours();
    float a=ch.calculateHours(beginTime, endTime);
    System.out.println(a);
    float  b   =  (float)(Math.round(a*10))/10;
    System.out.println(b);

}

}

解决方案

/*
*实现思路
*1. 判断指定日期是否掉是双休日
*2. 在通过获取指定日期的 月和日 判断是否是节假
*3. 判断是否有节假日 双休加班情况
*4. 如果上面的你已经了解,那么得到工作日就简单了,不写了,自己通过需求加上
*/
public void isOverDay(){ // 指定时间判断是否是双休日
String dates = "2013-05-13"; // 这里可以自定义
DateFormat df = new SimpleDateFormat("yy-MM-dd");
Date d;

try {

d= df.parse("");
if (d.getDay() == 0 || d.getDay() == 6){
System.out.println("日期:[" + dates + "] 是双休日");
}else{

System.out.println("日期:[" + dates + "] 不是双休日");

}
}catch (Exception e)
{

e.printStackTrace();
}
}

public void isHodliDays(){  // 判断是否滴节假日,是否有节假日加班
    //中国法定节假日期
    String isHoliday="01-01,01-02,01-03,02-09,02-10,02-11,02-12,02-13,02-14," +
                     "02-15,04-04,04-05,04-06,04-29,04-30,05-01,06-10,06-11," +
                     "06-12,09-19,09-20,09-21,10-01,10-02,10-03,10-04,10-05,10-06,10-07";

    //节假前后加班日期
    String overDay="01-05,01-06,02-16,02-17,04-07,04-17,04-28,06-08,06-09,09-22,09-19,10-12";

    //指定的 月份和日期
    String date="10-12";  // 这里可以自定义

    if (isHoliday.contains(date)) {
        System.out.println("是节假日...");
    }if (overDay.contains(date)) {
        System.out.println("节假前后加班日期...");
    }
}

这个你参考一下

解决方案二:

节假日排除掉的日期都是固定的吧,放到一个Map里就可以了;然后遍历一下,看Map中是否存在

解决方案三:

节假日,你可以考虑做一个表,其中存贮所在的节假日,然后在过滤星期时,先对此表的日期进行过滤

解决方案四:

我有个c#版本的,节假日做了个xml配置,然后按星期六、星期日默认休息,周一到周五默认上班,然后符合配置的就取反

时间: 2024-08-29 04:08:34

java-怎么排除两个日期之间的节假日,下面我这个是计算排除周末的工作时间,怎么把节假日排除掉,求指教的相关文章

使用java对给定的两个日期之间的日期进行遍历

问题描述 使用java对给定的两个日期之间的日期进行遍历 使用java对给定的两个日期之间的日期进行遍历,比如startTime 是 2014-07-11 endTime 是 2014-08-11 如何把他们之间的日期获取并遍历出来. 解决方案 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import j

利用Java中Calendar计算两个日期之间的天数和周数_java

前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每个月的天数各不同:阴(农)历,每个月固定28天 每周的第一天 - 阳(公)历星期日是第一天:阴(农)历,星期一是第一天 实际上,在历史上有着许多种纪元的方法.它们的差异实在太大了,比如说一个人的生日是"八月八日" 那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期.所以为了计时

php判断两个日期之间相差多少个月份的方法_php技巧

本文实例讲述了php判断两个日期之间相差多少个月份的方法.分享给大家供大家参考.具体实现方法如下: /** * @author injection(injection.mail@gmail.com) * @var date1日期1 * @var date2 日期2 * @var tags 年月日之间的分隔符标记,默认为'-' * @return 相差的月份数量 * @example: $date1 = "2003-08-11"; $date2 = "2008-11-06&qu

php判断两个日期之间相差多少个月份的方法

  本文实例讲述了php判断两个日期之间相差多少个月份的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /** * @author injection(injection.mail@gmail.com) * @var date1日期1 * @var date2 日期2 * @var tags 年月日之间的分隔符标记,默认为'-' * @return 相差的月份数量 * @example: $date1 = "

ASP.NET如何获取两个日期之间的天数

 这篇文章主要介绍了ASP.NET获取两个日期之间的天数方法,需要的朋友可以参考下  代码如下: DateTime startdate=DateTime.Parse("2013-11-01");  DateTime enddate = DateTime.Parse("2013-11-11");  int d = enddate.Subtract(startdate).Days;    定义开始时间startdate  结束时间enddate  使用方法Subtrac

Python获取两个日期之间的列表

QQ交流群:127591054 JackChiang QQ:595696297 获取两个日期之间的日期列表如:输入2012-09-21~2013-10-21 得到的结果为:2012-09-21,2012-09-22等等一直到2013-10-21 调用get_date_list函数传入一个时间范围列表:如get_date_list([1,'2012-09-21','2013-10-21']) 传入参数列表第0个代表状态,0代表日期传入是错误的,1,代表传入一个日期.2.代表传入两个日期,并且第二个

link用循环计算两个日期之间有多少工作日

问题描述 link用循环计算两个日期之间有多少工作日 用循环计算两个日期之间有多少工作日,link怎么实现?用takewhile怎么代替while? 解决方案 不考虑过节和轮休,写一个给你 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class P

java多线程中两个容器之间的同步

问题描述 java多线程中两个容器之间的同步 写了一个多线程的爬虫(对多线程不熟悉),但是每次队列中都有重复的元素,我把代码逻辑贴上来,大家帮我看一下,谢谢了: 在进程中: queue = LinkedBlockingQueue set = ConcurrentSkipListSet 在每个进程中使用了bfs bfs: while(!queue.empty()){ s = queue.poll() //...逻辑代码 set.add(s) //对s所有子状态扩展 for(son : s.sons

oracle中如何获取两个日期之间指定星期的日期是多少

问题描述 oracle中如何获取两个日期之间指定星期的日期是多少 如题,现在用户选择了一个起始日期和截止日期, 也选择了几个星期, 那么如何得到他选择的这几个星期的日期分别是多少? 解决方案 获取两个日期之间星期X的日期列表获取两个日期之间的日期间隔获取指定日期是星期几 解决方案二: 我的思路是这样的 1.写个方法,获取 起始,截止 日期之间 所有的日期 2.oracle提供了获取指定日期是星期几 的 函数 把选定的星期作为条件即可 解决方案三: DECLARE v_date date; v_n