我也做个类似的问题,算法: 1.计算首日的那个星期,将这个星期的工作日计算出来,记为A 2.计算结束日的那个星期,经那个星期的工作日计算出来,记为B 3.计算首日和结束日之间整的星期数,记为C 4.总工作日数: A + B + C * 7
@Test public void testExecute2() { Calendar before = Calendar.getInstance(); before.set(2012, 0, 5);
Calendar now = Calendar.getInstance(); now.setTime(new Date());
int i=0; while(now.after(before)){ int dayOfWeek = before.get(Calendar.DAY_OF_WEEK); System.out.println(EDateUtils.formatDate(before.getTime())); if(dayOfWeek==Calendar.SATURDAY||dayOfWeek==Calendar.SUNDAY){
try {
System.out.println(check(string2Date("2010-4-29"),string2Date("2011-6-4")));
} catch (Exception e) {
e.printStackTrace();
}
} public static int check(Date beginDate, Date endDate) throws Exception { Calendar cal = Calendar.getInstance();
cal.setTime(beginDate);
Integer beginYear = cal.get(Calendar.YEAR); cal.setTime(endDate);
Integer endYear = cal.get(Calendar.YEAR);
if (beginYear == endYear) {
return betweenDaysInSameYear(beginDate, endDate);
} else {
int sumDays = 0;
for (Integer i = beginYear; i <= endYear; i++) {
if (i == beginYear) {
sumDays += betweenDaysInSameYear(beginDate, string2Date(i.toString()+ "-12-31"));
} else if (i == endYear) {
sumDays += betweenDaysInSameYear(string2Date(i.toString()+ "-1-1"), endDate);
} else {
sumDays += betweenDaysInSameYear(string2Date(i.toString()+ "-1-1"), string2Date(i.toString() + "-12-31"));
}
}
return sumDays;
}
} public static int betweenDaysInSameYear(Date beginDate, Date endDate) {
Calendar cal = Calendar.getInstance();
cal.setTime(beginDate);
int beginWeek = cal.get(Calendar.WEEK_OF_YEAR);
int beginDay = cal.get(Calendar.DAY_OF_WEEK); cal.setTime(endDate);
int endWeek = cal.get(Calendar.WEEK_OF_YEAR);
int endDay = cal.get(Calendar.DAY_OF_WEEK); int beginDays = 0;
int endDays = 0;
switch (beginDay) {
case Calendar.SATURDAY:
beginDays = 0;
break;
case Calendar.SUNDAY:
beginDays = 0;
break;
default:
beginDays = Calendar.FRIDAY - beginDay + 1;
break;
}
switch (endDay) {
case Calendar.SATURDAY:
endDays = 5;
break;
case Calendar.SUNDAY:
endDays = 5;
break;
default:
endDays = endDay - 1;
break;
}
return beginDays+ ((endWeek - beginWeek - 2) * 5 < 0 ? 0 : ((endWeek- beginWeek - 2) * 5)) + endDays;
} public static Date string2Date(String dateStr) throws Exception {
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
return fmt.parse(dateStr);
}
先解释一下WEEKDAY函数
WEEKDAY函数返回某日期的星期数。在默认情况下,它的值为1(星期天)到7(星期六)之间的一个整数。
既然这样,我的想法如下:
1.可以先得到两个日期的星期数。并将较早的那一日期前推到上一个星期的周日(如果前一日起本就在周日,则不用前推),后一日期推后到本周六,并记录两次修改之后增加的天数,DAYADD1和DAYADD2。
2.计算出前后两个日期相隔的总天数,并加上DAYADD1和DAYADD2,得到两个日期改变后的总天数DAYALL(当然,这个数肯定是7的倍数。为什么?因为一个星期就只有7天)。
3.现在可以计算工作日的总天数了:
总工作日WEEKDAY=DAYALL-DAYADD1-DAYADD2-2(DAYALL/7)
解释一下上面:从改变(即前一日期前推,后一日期后推)后的总天数DAYALL,去掉改变日期时所增加的天数DAYADD1和DAYADD2,当然,还要去掉这段时间内的周末即后面的2(DAYALL/7)当然,这里需要判断一下,如果前一日期非周日,则需要在上面得到的结果中加1,后一日期非周六的时候,同样结果中要加1。最后得到的结果就是这一段时间内的总工作日天数。
如果是那样的话,还要判断日期为周六或周日,或者非周末的情况。因为这几个情况下,结果需要另加的天数不同
1.计算首日的那个星期,将这个星期的工作日计算出来,记为A
2.计算结束日的那个星期,经那个星期的工作日计算出来,记为B
3.计算首日和结束日之间整的星期数,记为C
4.总工作日数: A + B + C * 7
public void testExecute2() {
Calendar before = Calendar.getInstance();
before.set(2012, 0, 5);
Calendar now = Calendar.getInstance();
now.setTime(new Date());
int i=0;
while(now.after(before)){
int dayOfWeek = before.get(Calendar.DAY_OF_WEEK);
System.out.println(EDateUtils.formatDate(before.getTime()));
if(dayOfWeek==Calendar.SATURDAY||dayOfWeek==Calendar.SUNDAY){
}else{
i++;
}
before.add(Calendar.DATE, 1);
}
System.out.println(i);
}
Date begDate = sqrq, endDate = new Date();
getDaysStringList();
//初始化申请日期
while (!isWorkDay(begDate)) {
begDate = getNextDay(begDate);
}
while (!isWorkDay(endDate)) {
endDate = getNextDay(endDate);
} long quot = endDate.getTime() - begDate.getTime();
int holidays=0;
Date currDate=new Date();
currDate=RelativeDate.getDate(RelativeDate.getDateString(begDate, "yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss");
String currDateString=RelativeDate.getDateString(currDate, "yyyy-MM-dd");
String endDateString=RelativeDate.getDateString(endDate, "yyyy-MM-dd");
while(!currDateString.equals(endDateString)){
currDate=RelativeDate.daysAfter(currDate, 1);
currDateString=RelativeDate.getDateString(currDate, "yyyy-MM-dd");
if(!isWorkDay(currDate)){
holidays++;
}
}
quot=quot- holidays*1000*3600*24;
return quot;
} private boolean isWorkDay(Date theDate) throws AppException {
String dayTmp = "";
try {
//初始化申请日期
int iDayOfWeek = getDayOfWeek(theDate);
dayTmp = RelativeDate.getDateString(theDate, "MM-dd");
if (iDayOfWeek == 1) {
if (WorkdayList.indexOf(dayTmp) < 0) {
return false;
}
} else if (iDayOfWeek == 7) {
if (WorkdayList.indexOf(dayTmp) < 0) {
return false;
}
} else {
if (HolidayList.indexOf(dayTmp) >= 0) {
return false;
}
}
} catch (Exception e) {
throw new AppException("获得日期错误");
}
return true;
} private Date getNextDay(Date theDate) throws AppException {
String fullDayTmp = RelativeDate.getDateString(RelativeDate.daysAfter(theDate, 1), "yyyy-MM-dd") + " 00:00:01";
return RelativeDate.getDate(fullDayTmp, "yyyy-MM-dd HH:mm:ss");
} private void getDaysStringList() throws AppException {
String crossTableConfigXmlPath = InitParameter.getRealPath() + InitParameter.getWhHolidayXml() + ".xml";
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(crossTableConfigXmlPath); Element root = doc.getRootElement();
List children = root.getChildren();
for (int i = 0; i < children.size(); i++) {
Element node = (Element) children.get(i);
if (node.getName().toLowerCase().equals("holiday")) {
Attribute attr = node.getAttribute("days");
if (attr != null) {
HolidayList = attr.getValue();
}
} else if (node.getName().toLowerCase().equals("workday")) {
Attribute attr = node.getAttribute("days");
if (attr != null) {
WorkdayList = attr.getValue();
}
}
}
} catch (Exception e) {
throw new AppException(e);
}
} /**
* 返回传入日期所在的日
* @param d_date
* @return
* @throws java.lang.Exception
*/
private static int getDayOfWeek(Date d_date) throws Exception {
Calendar c = Calendar.getInstance();
c.setTime(d_date);
return c.get(Calendar.DAY_OF_WEEK); }
可以修改的xml配置文件:<?xml version="1.0" encoding="UTF-8"?><root>
<holiday days="01-02,01-03,01-23,01-24,01-25,01-26,01-27,04-02,04-03,04-04,04-30,05-01,06-22,10-01,10-02,10-03,10-04,10-05"/>
<workday days="01-21,01-29,03-31,04-01,04-28,09-29"/>
</root>
public static void main(String []args){
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
int num = 0;
c1.set(2011, 12-1, 1);
c2.set(2012, 1-1, 1);
for(Calendar tmp = c1;c1.getTime().compareTo(c2.getTime())<0;c1.add(c1.DAY_OF_YEAR, 1)){
if(tmp.getTime().getDay()!=6&&tmp.getTime().getDay()!=0){
num++;
}
}
System.out.println("=============================");
System.out.println(num);
}
试下这个