欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java * 工作日计算

程序员文章站 2022-05-17 21:36:48
...
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;
		}
	}
}