黑马程序员技术交流社区
标题:
求js或java日期工作日算法,最好是js版。
[打印本页]
作者:
黑马伍仪华
时间:
2012-3-3 20:37
标题:
求js或java日期工作日算法,最好是js版。
求js或java日期工作日算法,最好是js版。
需求: 初始日期假设是2012-03-01 然后需要在当前日期上加上60个工作日 然后计算出排除周末后的日期。
2012-03-01 + 60个工作日的日期(排除周六日)。
作者:
黄秋
时间:
2012-3-7 03:08
本帖最后由 黄秋 于 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); 也怪怪的,欢迎大家讨论。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2