package com.szhome.lands.common.util;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
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())); // 节假日加班天数
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;
}
}
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;
}
}