个人笔记 java 根据排班计划得出工作时间(排除节假日,周末,休息方式)

个人笔记,根据业务需求所写
思路:得到查找的时间段(date1)所跨的排班计划(data)
遍历每个排班计划的开始时间与结束时间,以及是否存在节假日(节假日开始时间,结束时间),休息方式(单休,双休,无休)。
数据结构如下:
第一条:date1的开始时间----data(0)的排班结束时间
中间的排班计划:data()的排班开始时间----排班结束时间
最后一条排班计划:data(data.size)排班开始时间-----date1结束时间
拿到数据结构后,每一个时间段与节假日时间段进行比较(存在节假日),算出两者重叠时间,以及周六周日的重叠天数

 /**
       * 计划工作时间/天
       * @param startDate 往前30天
       * @param endDate	今日
       * @param filter
       * @return
       * @throws DatasweepException
       */
      private long getPlanTime(String startDate,String endDate,RunningStatusFilter filter) throws DatasweepException{
    	  String key = null;
    	  String startPlan = null;
    	  String endPlan = null;
    	  String startHoliday = null;
    	  String endHoliday = null;
    	  String weekendPlan = null;

    	  long sumHoliday = 0;//假期天数
    	  long sumDay = 0;
    	  DateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    	  
    	  Map map = new HashMap();
    	  
    	try{
    		Vector data = filter.getPlanWorkTime(startDate,endDate);//获取开始时间所处时间段
    		
    		Date d1=sdf.parse(startDate);
    		Date d2=sdf.parse(endDate);
    		sumDay = (d2.getTime()-d1.getTime()+1000000)/(3600*24*1000);//间隔时间天数
    		
    		if(0!=data.size()&&null!=data)
    		{
    			for(int i =0;i dateUtils(String startPlans, String endPlans, String startHoliday, String endHoliday) throws ParseException{
  			Map map = new HashMap();
    	  	long reapertdays = 0;//重叠天数
    	  	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  			// 标准时间
  			Date bt = sdf.parse(startPlans);
  			Date ot = sdf.parse(endPlans);
  			// 目标时间
  			Date st = sdf.parse(startHoliday);
  			Date ed = sdf.parse(endHoliday);
  			
  			long btlong = Math.min(bt.getTime(), ot.getTime());// 开始时间
  			long otlong = Math.max(bt.getTime(), ot.getTime());// 结束时间
  			long stlong = Math.min(st.getTime(), ed.getTime());// 开始时间
  			long edlong = Math.max(st.getTime(), ed.getTime());// 结束时间
  			if ((stlong >= btlong && stlong <= otlong) || (edlong >= btlong && edlong <= otlong)) {
  				// 一定有重叠部分
  				long sblong = stlong >= btlong ? stlong : btlong;
  				long eblong = otlong >= edlong ? edlong : otlong;
  				String sblongs = sdf.format(sblong);
  				String eblongs = sdf.format(eblong);
  				
  				Date d1=sdf.parse(sblongs);
				Date d2=sdf.parse(eblongs);
				
				String ds1 = sdf.format(d1);
				String ds2 = sdf.format(d2);
				reapertdays=((d2.getTime()-d1.getTime())/(3600*24*1000))+1;//重叠天数
				
				map.put("reapertdays", reapertdays);
				map.put("Ds1", ds1);
				map.put("Ds2", ds2);
				return map;
  			}
  			map.put("reapertdays", reapertdays);
  			return map;  
      }
      /**
       * 节假日与周末重叠 天数
       * @param startHoliday 假期开始时间
       * @param holiday 假期天数
       * @param restType 休息方式 1:双休  2:周日单休
       * @return
       * @throws Exception
       */
      private long isReapert(String startHoliday,long holiday,long restType) throws Exception{
    	  long reatpertDay =0;
    	  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    	  int dayForWeek = 0;
    	  if(holiday==1){//假期只有一天,且为双休形式,得出一天假期为星期几
    		  Calendar c = Calendar.getInstance();
    		  c.setTime(format.parse(startHoliday)); 
        	  if(c.get(Calendar.DAY_OF_WEEK) == 1){
        	   dayForWeek = 7;
        	  }else{
        	   dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
        	  }
    		  if(restType==1){
            	  if(dayForWeek==6||dayForWeek==7){
            		  reatpertDay = 1;
            	  }
    		  }
    		  if(restType==2){
        		  if(dayForWeek==7){
        			  reatpertDay = 1;
        		  }
        	  }
    	  }else{
    		  Calendar calendar  =  new GregorianCalendar(); 
    		  for(int i=0;iEW)//给定的星期几大于结束日期的星期几,需要减少一天
                  sunDay--;
          }catch(Exception se){
              se.printStackTrace();
          }
          return sunDay;
      } 
}

你可能感兴趣的:(笔记,个人笔记)