Java 政府 工作日计算

package com.jc.servlet;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class Test {

	
	//计算工作日实际日期
	@org.junit.Test
	public void test() {
		 try {
		        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
		        Calendar ca = Calendar.getInstance();  
		        Date d = df.parse("2016-12-8");  
		        ca.setTime(d);//设置当前时间  
		          
		        
		        initHolidayList("2014-11-06");//初始节假日  
		        initHolidayList("2014-11-07");//初始节假日  
		        initHolidayList("2014-11-03");//初始节假日  
		          
		        Calendar c = addDateByWorkDay(ca,3);  
		        System.out.println(df.format(c.getTime()));  
		          
		    } catch ( Exception e) {
		        // TODO: handle exception
		        System.out.println(e.getClass());
		        e.printStackTrace();
		    }
	}
	
	@org.junit.Test
	public void test2 () throws Exception{
		String sdate = "2016-12-08";
		String edate = "2016-12-13";
		long day = getDaySub(sdate,edate);
		System.out.println(day);
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");  
        Calendar ca = Calendar.getInstance();  
        Date d = df.parse(sdate);  
        ca.setTime(d);//设置当前时间  
		long gzr = endDay_startDay(ca,day);
		
		System.out.println(gzr);
	}

	/**
	 * 两个日期相减
	 * @param beginDateStr
	 * @param endDateStr
	 * @return
	 */
	public static long getDaySub(String beginDateStr,String endDateStr){
		long day=0;
		SimpleDateFormat format = new java.text.SimpleDateFormat("yyyy-MM-dd");
		Date beginDate;
		Date endDate;
		try{
			beginDate = format.parse(beginDateStr);
			endDate= format.parse(endDateStr);
			day=(endDate.getTime()-beginDate.getTime())/(24*60*60*1000);
		//System.out.println("相隔的天数="+day);
		} catch (ParseException e){
		// TODO 自动生成 catch 块
			e.printStackTrace();
		}
		return day+1;
	}
	 /**
	  * 自定义节假日
	  */
	 private static List<Calendar> holidayList = new ArrayList<Calendar>();  //节假日列表  
	 /**
	  * 计算一个日期后的多少天有几个休息日,并用使用天数减去工作日获得实际工作日。
	  * @param calendar
	  * @param day
	  * @return
	  * @throws Exception
	  */
	 public static long endDay_startDay(Calendar calendar,long day) throws Exception{
		 long result = 0;
		 for (int i=0; i<day; i++){
			 calendar.add(Calendar.DAY_OF_MONTH, 1);
			 if(checkHoliday(calendar)){
				 result++;
             }
		 }
		 
		 return day-result-1;
	 }
	 
	 /**  
	  *   
	  * <p>Title: addDateByWorkDay </P>  
	  * <p>Description: TODO  计算相加day天,并且排除节假日和周末后的日期</P>  
	  * @param calendar  当前的日期  
	  * @param day  相加天数  
	  * @return     
	  * return Calendar    返回类型   返回相加day天,并且排除节假日和周末后的日期  
	  * throws   
	  * date 2014-11-24 上午10:32:55  
	  */  
	 public static Calendar addDateByWorkDay(Calendar calendar,int day){  
	       
	     try {  
	        for (int i = 0; i < day; i++) {
	              
	             calendar.add(Calendar.DAY_OF_MONTH, 1);  
	               
	             if(checkHoliday(calendar)){
	                 i--;  
	             }
	        }
	        return calendar;  
	          
	       
	    } catch (Exception e) {  
	        e.printStackTrace();  
	    }  
	    return calendar;  
	 }
	 
	 /**
	  * 
	  * @param calendar
	  * @param day
	  * @return
	  */
	 public Calendar addDateDay(Calendar calendar,int day){  
	       
	     try {  
	        for (int i = 0; i < day; i++) {  
	              
	             calendar.add(Calendar.DAY_OF_MONTH, 1);  
	               
	             if(checkHoliday(calendar)){  
	                 i++;  
	             }
	        }
	        return calendar;  
	          
	       
	    } catch (Exception e) {  
	        e.printStackTrace();  
	    }  
	    return calendar;  
	 }
	 
	 /**  
	  *   
	  * <p>Title: checkHoliday </P>  
	  * <p>Description: TODO 验证日期是否是节假日</P>  
	  * @param calendar  传入需要验证的日期  
	  * @return   
	  * return boolean    返回类型  返回true是节假日,返回false不是节假日  
	  * throws   
	  * date 2014-11-24 上午10:13:07  
	  */  
	 public static boolean checkHoliday(Calendar calendar) throws Exception{  
	       
	     //判断日期是否是周六周日  
	     if(calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY ||   
	             calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY){  
	         return true;  
	     }  
	     //判断日期是否是节假日  
	     for (Calendar ca : holidayList) {  
	        if(ca.get(Calendar.MONTH) == calendar.get(Calendar.MONTH) &&  
	                ca.get(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH)&&  
	                ca.get(Calendar.YEAR) == calendar.get(Calendar.YEAR)){  
	            return true;  
	        }
	    }  
	        
	     return false;  
	 }  
	   
	 /**  
	  *   
	  * <p>Title: initHolidayList </P>  
	  * <p>Description: TODO  把所有节假日放入list</P>  
	  * @param date  从数据库查 查出来的格式2014-05-09  
	  * return void    返回类型   
	  * throws   
	  * date 2014-11-24 上午10:11:35  
	  */  
	public static void initHolidayList( String date){  
	      
	        String [] da = date.split("-");
	        Calendar calendar = Calendar.getInstance();  
	        calendar.set(Calendar.YEAR, Integer.valueOf(da[0]));  
	        calendar.set(Calendar.MONTH, Integer.valueOf(da[1])-1);//月份比正常小1,0代表一月  
	        calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(da[2]));  
	        holidayList.add(calendar);  
	}
	
	/**
	 * 判断星期六与星期日
	 * @param bDate 
	 * @param aDate
	 * @return
	 * @throws ParseException
	 */
	public boolean isSunAndSatur(String bDate) throws ParseException{
		DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");        
		//String bDate = "2016-12-19";
		//String aDate = "2016-12-30";
		Date bdate = format1.parse(bDate);
		Calendar cal = Calendar.getInstance();
		cal.setTime(bdate);
		if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
			System.out.print("ok");
			return true;
		}else {
			System.out.print("no");
			return false;
		}
	}
}

猜你喜欢

转载自aa80303857.iteye.com/blog/2346209
今日推荐