计算两个时间间隔小时且不包括周末,每天8小时,eg 2015-05-10 10:00:00
2015-05-20 16:00:00 要算出这两个时间相差的小时数而且不包括周末时间,其他时间一天8小时计算
并且 10:00 到18点,9点到16点这两个时间点也要计算上,该怎么写
之前的代码确实有问题,现在做了修改。
package aaa;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CalculateHours {
//该处时间可以根据实际情况进行调整
int ab = 8;//上午上班时间
int ae = 12;//下午下班时间
int pb = 13;//下午上班时间
int pe = 17;//下午下班时间
int hoursPerDay = ae-ab+pe-pb;//每天上班小时数
int daysPerWeek = 5;//每周工作天数
long milsecPerDay = 1000*60*60*24;//每天的毫秒数
int hoursPerWeek = hoursPerDay*daysPerWeek;//每星期小时数
public int calculateHours(String beginTime, String endTime){
Date t1 = stringToDate(beginTime);//真实开始时间
Date t2 = stringToDate(endTime);//真实结束时间
if(t1.getTime()>t2.getTime())
return -1;
if(t1.getYear()==t2.getYear()&&t1.getMonth()==t2.getMonth()&&t1.getDate()==t2.getDate()){
if(t2.getHours()<=ab||t1.getHours()>pe||(t1.getHours()>=ae&&t2.getHours()<=pb)){
return 0;
}
if(t1.getHours()<=ab){
return calculateHoursInOneDay2(t2.getHours());
}
if(t2.getHours()>=pe){
return calculateHoursInOneDay(t1.getHours());
}
if(t2.getHours()<=ae||t1.getHours()>=pb){
return t2.getHours() - t1.getHours();
}
if(t1.getHours()<=ae&&t2.getHours()>=pb){
return t2.getHours()-t1.getHours()-(pb-ae);
}
if(t2.getHours()<=pb){
return ae-t1.getHours();
}
return t2.getHours()-pb;
}
//开始时间当天,上午上班时间
Date temp1 = new Date(t1.getYear(),t1.getMonth(),t1.getDate(),ab,0);
//结束时间当天,上午上班时间
Date temp2 = new Date(t2.getYear(),t2.getMonth(),t2.getDate(),ab,0);
Date sunday1;//晚于开始时间的最近的星期天
Date sunday2;//早于结束时间的最近星期天
sunday1 = new Date(temp1.getTime()+(7-temp1.getDay())*milsecPerDay);
sunday2 = new Date(temp2.getTime()-temp2.getDay()*milsecPerDay);
long weeks = (sunday2.getTime()-sunday1.getTime())/(milsecPerDay*7);
int hour1 = 0;//第一周剩余的小时数
int hour2 = 0;//最后一周剩余的小时数
int hour3 = 0;//中间的小时数
hour3 = (int) (weeks * hoursPerWeek);
if(t1.getDay()==0||t1.getDay()==6){
hour1 = hoursPerWeek;
}else{
hour1 += (5-t1.getDay())*hoursPerDay;
hour1 += calculateHoursInOneDay(t1.getHours());
}
if(t2.getDay()==0){
hour2 = 0;
}else{
hour2 += (t2.getDay()-1)*hoursPerDay;
if(t2.getDay()!=6){
hour2 += calculateHoursInOneDay2(t2.getHours());
}
}
System.out.println(t1);
System.out.println(t2);
System.out.println(weeks);
int hours = hour1 + hour2 + hour3;
System.out.println(hours);
return hours;
}
/**
* 计算一天内的工作时间
* @param hour 当天的时刻,开始时间
* @return
*/
private int calculateHoursInOneDay(int hour) {
if(hour>=pe)
return 0;
if(hour>=pb)
return pe-hour;
if(hour>ae)
return pe-pb;
if(hour>ab)
return ae-hour+pe-pb;
return 0;
}
/**
* 计算一天内的工作时间
* @param hour 当天的时刻,结束时间
* @return
*/
private int calculateHoursInOneDay2(int hour) {
if(hour>=pe)
return hoursPerDay;
if(hour>=pb)
return ae-ab+hour-pb;
if(hour>ae)
return ae-ab;
if(hour>ab)
return hour-ab;
return 0;
}
/**
* 将字符串形式的时间转换成Date形式的时间
* @param time
* @return
*/
private Date stringToDate(String time){
SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); //这里的格式可以自己设置
try {
return format.parse(time);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
}
这样应该可以了
http://www.tuicool.com/articles/nQzE32
http://blog.csdn.net/jiajia333666/article/details/48026695
我实现了一个,应该能满足你的需求,如有疑惑可联系425850693@qq.com
String d1="2015-08-16 10:00:00";
String d2="2015-08-16 16:00:00";不对啊,当天工作时间他是计算不出来的
用Calendar类实现。