问题描述
- 怎么排除两个日期之间的节假日,下面我这个是计算排除周末的工作时间,怎么把节假日排除掉,求指教
-
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配置,然后按星期六、星期日默认休息,周一到周五默认上班,然后符合配置的就取反