增加了方法:当时间单位为小时时的处理
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
public class WorkDay {
private static long aa = 32400000L; //9:00上班;12:00下班;13:00上班;18:00下班
private static long bb = 43200000L;
private static long cc = 46800000L;
private static long dd = 64800000L;
public static void main(String[] args) throws ParseException {
long x = onlyWorkHour(1396000800000L, 1396022400000L);
System.out.println(new Date(x));
}
//只计算工作日-xiaoshi
public static long onlyWorkHour(long start, long end){
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = new Date(start);
Date startTempDate = sdf.parse(sdf.format(startDate));
long realStart = startTempDate.getTime(); //参与运算的起始时间毫秒数
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeInMillis(realStart); //设置起始日历日期
long millOfDayMod = start - realStart; //起始时间对天取余所得时间毫秒数
if(millOfDayMod < aa){
millOfDayMod = aa;
}else if(bb <= millOfDayMod && millOfDayMod < cc){
millOfDayMod = cc;
}else if(dd <= millOfDayMod){
millOfDayMod = aa;
gc.add(GregorianCalendar.DATE, 1);
realStart = realStart + 3600000*24;
}
realStart = realStart + millOfDayMod;
end = end - start + realStart;
long hour = (end - realStart)/3600000; //虚结束时间与起始时间的小时差,一定是整数
long workHour = 0;
while(workHour < hour){
millOfDayMod = millOfDayMod + 3600000; //以1小时为单位
if((millOfDayMod-3600000) < bb && cc <= millOfDayMod){ //中午休息时间小于1小时
millOfDayMod = millOfDayMod + (cc - bb);
}
if(aa <= millOfDayMod && millOfDayMod <= bb){
workHour++;
}else if(bb < millOfDayMod && millOfDayMod < cc){
millOfDayMod = millOfDayMod + (cc - bb);
}
if(cc < millOfDayMod && millOfDayMod <= dd){
workHour++;
}else if(dd < millOfDayMod){
gc.add(GregorianCalendar.DATE, 1);
while(gc.get(GregorianCalendar.DAY_OF_WEEK) == GregorianCalendar.SATURDAY ||
gc.get(GregorianCalendar.DAY_OF_WEEK) == GregorianCalendar.SUNDAY) {
gc.add(GregorianCalendar.DATE, 1);
}
millOfDayMod = (millOfDayMod + (3600000*24-dd+aa))%(3600000*24);
workHour++;
}
}
long endMill = gc.getTimeInMillis() + millOfDayMod;
return endMill;
} catch (ParseException e) {
e.printStackTrace();
return 0L;
}
}
//只计算工作日--ri
public static long onlyWorkTime(long start, long end){
long endMill = 0L;
GregorianCalendar gc = new GregorianCalendar();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = new Date(start);
Date endDate = new Date(end);
long workDay = 0;
try {
Date startTempDate = sdf.parse(sdf.format(startDate));
Date endTempDate = sdf.parse(sdf.format(endDate));
long mod = end - endTempDate.getTime();
gc.setTime(startTempDate);
long time = endTempDate.getTime() - startTempDate.getTime();
long day = time/3600000/24;
if(0 == day){
while(gc.get(GregorianCalendar.DAY_OF_WEEK) == GregorianCalendar.SATURDAY ||
gc.get(GregorianCalendar.DAY_OF_WEEK) == GregorianCalendar.SUNDAY) {
gc.add(GregorianCalendar.DATE, 1);
}
}else{
while(workDay < day){
gc.add(GregorianCalendar.DATE, 1);
if (gc.get(GregorianCalendar.DAY_OF_WEEK) != GregorianCalendar.SATURDAY &&
gc.get(GregorianCalendar.DAY_OF_WEEK) != GregorianCalendar.SUNDAY) {
workDay++;
}
}
}
endMill = mod + gc.getTime().getTime();
return endMill;
} catch (Exception e) {
// logger.error("计算工作日方法异常,异常原因如下:", e);
return 0;
}
}
}