只计算工作日2

增加了方法:当时间单位为小时时的处理

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;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值