A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

求js或java日期工作日算法,最好是js版。

需求: 初始日期假设是2012-03-01 然后需要在当前日期上加上60个工作日 然后计算出排除周末后的日期。

2012-03-01 + 60个工作日的日期(排除周六日)。

1 个回复

倒序浏览
本帖最后由 黄秋 于 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) 。
  1. import java.util.*;
  2. class  Test
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 System.out.println(workDate(2012,3,1,1));
  7.                 System.out.println(workDate(2012,3,2,1));
  8.                 System.out.println(workDate(2012,3,3,1));
  9.                 System.out.println(workDate(2012,3,4,1));
  10.                 System.out.println(workDate(2012,3,2,16));
  11.                 System.out.println(workDate(2012,3,1,60));
  12.         }
  13.         static String workDate(int year,int month,int date,int i){
  14.                 Calendar c = Calendar.getInstance();
  15.                 c.set(year,month-1,date);
  16.                 int week=c.get(c.DAY_OF_WEEK);
  17.                 if(week+i>7){          //星期的值加上工作日>7,才跨周,需加相应天数
  18.                         firstWeek(c);        //第一周假日特殊处理
  19.                         int firstDays=7-week+2;        //第一周的工作日
  20.                         c.add(Calendar.DATE,firstDays);
  21.                         i=i-firstDays;        //剩下的工作日
  22.                 }
  23.                 i=i/5*7+i%5;       
  24.                 c.add(Calendar.DATE,i);
  25.                 toWorkdate(c);        //周六、日分别顺延1、2天
  26.                 return c.get(c.YEAR)+" "+(c.get(c.MONTH)+1)+" "+c.get(c.DATE);
  27.         }
  28.         static Calendar toWorkdate(Calendar c){        //最后算到的日子遇周六、日顺延
  29.                 int i=0;
  30.                 if(c.get(c.DAY_OF_WEEK)==1)          //周日顺延一天
  31.                         i=1;
  32.                 else if(c.get(c.DAY_OF_WEEK)==7) //周六顺延二天
  33.                         i=2;
  34.                 c.add(Calendar.DATE,i);
  35.                 return c;
  36.     }
  37.         static Calendar firstWeek(Calendar c){        //第一周据情况加适合的天数
  38.                 int i=2;                //周一至周五加二天
  39.                 if(c.get(c.DAY_OF_WEEK)==1)          //周日不用加
  40.                         i=0;
  41.                 else if(c.get(c.DAY_OF_WEEK)==7) //周六加一天
  42.                         i=1;
  43.                 c.add(Calendar.DATE,i);
  44.                 return c;
  45.     }
  46. }
复制代码
输出:
  1. 2012 3 2
  2. 2012 3 5
  3. 2012 3 5
  4. 2012 3 5
  5. 2012 3 26
  6. 2012 5 24
复制代码
PS: setFirstDayOfWeek设置一星期的第一天并不好用,加上set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 也怪怪的,欢迎大家讨论。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马