本帖最后由 黄秋 于 2012-3-7 03:35 编辑
网上搜了下,多数是用循环,不断测试是否是周六、日,这样效率并不高(尤其是天数多时)。现基本思想是,每周从周一到周日,第一周作为特殊情况单独处理。之后从周一开始,每5个工作日就对应有两天假日,共7天,有多少“5个工作日”就有多少7天:i/5*7,因不一定被5 整除,加上余数:i=i/5*7+i%5; (这点网上有类似的,但不全面)
啰嗦的是第一周,因给出的开始日期星期几都有可能,当然也可将周六、日排除,我的包括在内。要注意的是,美国一星期的第一天是周一,DAY_OF_WEEK 周日是“1”,周六是“7”。开始日期是星期五(当天不算一工作日),加两个工作日,是下周二,要4天,即要加2天假日;开始日期是星期四,也要加2天,星期三也是……; 但 星期四+1个工作日,明天星期五就是了,不用加2,所以有了判断:if(week+i>7) 。- import java.util.*;
- class Test
- {
- public static void main(String[] args)
- {
- System.out.println(workDate(2012,3,1,1));
- System.out.println(workDate(2012,3,2,1));
- System.out.println(workDate(2012,3,3,1));
- System.out.println(workDate(2012,3,4,1));
- System.out.println(workDate(2012,3,2,16));
- System.out.println(workDate(2012,3,1,60));
- }
- static String workDate(int year,int month,int date,int i){
- Calendar c = Calendar.getInstance();
- c.set(year,month-1,date);
- int week=c.get(c.DAY_OF_WEEK);
- if(week+i>7){ //星期的值加上工作日>7,才跨周,需加相应天数
- firstWeek(c); //第一周假日特殊处理
- int firstDays=7-week+2; //第一周的工作日
- c.add(Calendar.DATE,firstDays);
- i=i-firstDays; //剩下的工作日
- }
- i=i/5*7+i%5;
- c.add(Calendar.DATE,i);
- toWorkdate(c); //周六、日分别顺延1、2天
- return c.get(c.YEAR)+" "+(c.get(c.MONTH)+1)+" "+c.get(c.DATE);
- }
- static Calendar toWorkdate(Calendar c){ //最后算到的日子遇周六、日顺延
- int i=0;
- if(c.get(c.DAY_OF_WEEK)==1) //周日顺延一天
- i=1;
- else if(c.get(c.DAY_OF_WEEK)==7) //周六顺延二天
- i=2;
- c.add(Calendar.DATE,i);
- return c;
- }
- static Calendar firstWeek(Calendar c){ //第一周据情况加适合的天数
- int i=2; //周一至周五加二天
- if(c.get(c.DAY_OF_WEEK)==1) //周日不用加
- i=0;
- else if(c.get(c.DAY_OF_WEEK)==7) //周六加一天
- i=1;
- c.add(Calendar.DATE,i);
- return c;
- }
- }
复制代码 输出:- 2012 3 2
- 2012 3 5
- 2012 3 5
- 2012 3 5
- 2012 3 26
- 2012 5 24
复制代码 PS: setFirstDayOfWeek设置一星期的第一天并不好用,加上set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 也怪怪的,欢迎大家讨论。 |