java 计算工作日工具类

package com.szhome.lands.common.util;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import com.szhome.commons.database.Row;
import com.szhome.commons.exception.GeneralFailureException;
import com.szhome.platform.integration.dao.UnionKeyDao;
/**
 * 计算工作日
 * @author Administrator
 *
 */
public class WorkDateUtil {
 public static String computeEndDate(String startDate,int days)
   throws GeneralFailureException {
  UnionKeyDao dao = new UnionKeyDao();
  String ls_JndiName = LandsProps.getInstance().getMainJndiName();
  dao.setJndiName(ls_JndiName);
  SimpleDateFormat startDateSimpleDF = new SimpleDateFormat("yyyy-MM-dd");
  GregorianCalendar endDateGC = new GregorianCalendar(); //标识日历时间类
  int weeknum = -1;
  int computDays=0;
  try {
   computDays=days;//工作日天数
   startDate=ConversiondateFomat(startDate);
   endDateGC.setTime(startDateSimpleDF.parse(startDate)); //获取日历日期
//   startDateGC.add(5,+1);
   //if (dateType==Supervise.DATE_TYPE_WORK) {//工作日
    weeknum = endDateGC.get(Calendar.DAY_OF_WEEK);//周六
    while(computDays>0) {
     if (weeknum != 1 && weeknum != 7) {//1代表周日,7代表周六
      --computDays;//获取天数中周末天数
     }
     endDateGC.add(5,+1);//设置为周末
     weeknum = endDateGC.get(Calendar.DAY_OF_WEEK);//获取周末
    }//此段逻辑就是获取周末天数
    while(weeknum== 1||weeknum== 7) {//如果为星期六,星期天应继续往后移动Modify by liuy 2009-05-21
      endDateGC.add(5,+1);
      weeknum = endDateGC.get(Calendar.DAY_OF_WEEK);
    }//如果结束日期为周末,结束日期则往后移
                //Modify by wangyi080108_01, 修改最后期限计算中关于节假日和加班日的算法    
//     统计开始日期到结束日期的节假日调休加班的天数
    int overTimecount=statOverTimeCount(dao,startDate,startDateSimpleDF.format(endDateGC.getTime())); // 节假日加班天数
//    统计开始日期到结束日期的节假日休息的天数
    int recesscount= recessCount(dao,startDate,startDateSimpleDF.format(endDateGC.getTime())); // 节假日休息
    
//    统计开始日期到结束日期的节假日休息的天数与节假日调休加班的天数之差
    int needMoveCount = recesscount - overTimecount;
    
    int moveStep = 0;//日期移动步长
    int totalMoveCount = 0;//已移动的工作日天数
    if (needMoveCount != 0) {
     if (needMoveCount > 0) {//正数表示需在endDateGC的基础上向后累加needMoveCount个工作日
      moveStep = 1;
     }else if (needMoveCount < 0) {//负数表示需在endDateGC的基础上向前递减needMoveCount个工作日
      moveStep = -1;
     }
     while (totalMoveCount != Math.abs(needMoveCount)) {
      endDateGC.add(5, moveStep);
      if (isWorkDay(dao,startDateSimpleDF, endDateGC)) {
       totalMoveCount++;
      }
     }
    }else{ //如期限之间加班与放假天数一样时,还需判断最后天是否为工作日,如是是工作日就要往前移一天  modify by liuyun at 2009-09-04  
     while(!isWorkDay(dao,startDateSimpleDF, endDateGC)) {
      endDateGC.add(5, -1);      
     }
     
    }
    /*} else {
    endDateGC.add(5,+days);
   //}*/
    //包含当天计算
   /* System.err.println("+++++++"+endDateGC.get(Calendar.DAY_OF_WEEK));
    if(endDateGC.get(Calendar.DAY_OF_WEEK) == 2){
     endDateGC.add(5, -3);
    }else{
     endDateGC.add(5, -1);
    }*/
  } catch (Exception e) {
   throw new GeneralFailureException(e);
  }
  System.err.println("*******************"+startDateSimpleDF.format(endDateGC.getTime()));
  return startDateSimpleDF.format(endDateGC.getTime());
 }
 private static String ConversiondateFomat(String conversionDate) {
  String dateconv = "";
  if (conversionDate.length() > 10) {
   dateconv = conversionDate.substring(0, 10).trim();
  } else {
   dateconv = conversionDate;
  }
  return dateconv;
 }
 
 public static int statOverTimeCount(UnionKeyDao dao,String startDate,String endDate)
   throws GeneralFailureException {
  SimpleDateFormat overTimeSimpleDF = new SimpleDateFormat("yyyy-MM-dd");
  GregorianCalendar overTimeGC = new GregorianCalendar();
  GregorianCalendar endoverTimeGC = new GregorianCalendar();  
 
  int overTimeCount = 0;
  try {
   startDate=ConversiondateFomat(startDate);
   overTimeGC.setTime(overTimeSimpleDF.parse(startDate));
   endDate=ConversiondateFomat(endDate);
   endoverTimeGC.setTime(overTimeSimpleDF.parse(endDate));
   /*List overTimeList = holsdelegate.queryHolsYear(overTimeSimpleDF
     .format(overTimeGC.getTime()).replaceAll("-", ""), overTimeSimpleDF
     .format(endoverTimeGC.getTime()).replaceAll("-", ""), "T");*/
   String sql1 = "  select count(distinct hols_day) holds  from bw_hols d where 1 = 1   and d.hols_day  >=to_date('"+startDate+"','yyyy-MM-dd')  and d.hols_day  <=to_date('"+endDate+"','yyyy-MM-dd')  and d.on_duty='T'   ";
   /*List overTimeList = dao.findRecords(sql1);
   overTimeCount=overTimeList.size();*/
   Row row =(Row)dao.findFirstRecord(sql1);
   overTimeCount =  row.getInt("holds");
            System.out.println("调休:"+ overTimeCount);
  } catch (Exception e) {
   throw new GeneralFailureException(e);
  }
  return overTimeCount;
 }
 public static int recessCount(UnionKeyDao dao,String startDate,String endDate) throws GeneralFailureException {
  SimpleDateFormat overTimeSimpleDF = new SimpleDateFormat("yyyy-MM-dd");
  GregorianCalendar overTimeGC = new GregorianCalendar();
  GregorianCalendar endoverTimeGC = new GregorianCalendar();
  //HolsDelegate holsdelegate = new HolsDelegate();  
  int overTimeCount = 0;
  try {
   /*startDate=ConversiondateFomat(startDate);
   overTimeGC.setTime(overTimeSimpleDF.parse(startDate));
   endDate=ConversiondateFomat(endDate);
   endoverTimeGC.setTime(overTimeSimpleDF.parse(endDate));
   List overTimeList = holsdelegate.queryHolsYear(overTimeSimpleDF
     .format(overTimeGC.getTime()).replaceAll("-", ""), overTimeSimpleDF
     .format(endoverTimeGC.getTime()).replaceAll("-", ""), "F");
   overTimeCount=overTimeList.size();*/
   String sql = "  select count(distinct hols_day) holds  from bw_hols d where 1 = 1   and d.hols_day  >=to_date('"+startDate+"','yyyy-MM-dd')  and d.hols_day  <=to_date('"+endDate+"','yyyy-MM-dd')  and d.on_duty='F'   ";
   Row row =(Row)dao.findFirstRecord(sql);
   overTimeCount =  row.getInt("holds");
   System.err.println("法定节假日:"+overTimeCount);
  } catch (Exception e) {
   throw new GeneralFailureException(e);
  }
  return overTimeCount;
 }
 private static boolean isWorkDay(UnionKeyDao dao,SimpleDateFormat startDateSimpleDF, GregorianCalendar endDateGC) throws GeneralFailureException {
  boolean result = true;
  int endweeknum=endDateGC.get(Calendar.DAY_OF_WEEK);
  int enddateOverTime=statOverTimeCount(dao,startDateSimpleDF.format(endDateGC.getTime()),startDateSimpleDF.format(endDateGC.getTime()));
  int enddateRecess=recessCount(dao,startDateSimpleDF.format(endDateGC.getTime()),startDateSimpleDF.format(endDateGC.getTime())); 
  //判断不是上班日
  if (((endweeknum==1 || endweeknum==7) && enddateOverTime==0)//是星期6或星期天且不加班
   ||(endweeknum!=1 && endweeknum!=7 && enddateRecess>0))//或者,不是星期6或星期天且休假
  {
   result = false; 
  }
  return result;
 }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值