求js或java日期工作日算法,最好是js版。
需求: 初始日期假设是2012-03-01 然后需要在当前日期上加上60个工作日 然后计算出排除周末后的日期。
2012-03-01 + 60个工作日的日期(排除周六日)。
网上找了几个版本都不是太好用,因为工期原因自己一方面改一方面求。 烦请js或java牛人帮忙。 谢谢!
自己写的,你试试
[code="js"]
function getworkday(date,itervalByDay){
var date=new Date();
var millisceonds =date.getTime();
for(var i=1;i<=itervalByDay;i++){
millisceonds +=24*60*60*1000;
date.setTime(millisceonds);
if(date.getDay()==0||date.getDay()==6) i--;
}
return date;
}
[/code]
忘记说参数了,第一个date是日期类型的,第二个间隔时间是整形的,只考虑间隔大于0的
public static void main(String[] args) {
long beginTime=new Date("01-Mar-2012").getTime();
long stepTime=24*60*60*1000;
Date dt;
int dy;
Long endTime=beginTime;
int k=0;
while(k<60){
endTime+=stepTime;
dt=new Date(endTime);
dy=dt.getDay();
if(dy!=0&&dy!=6){
k++;
}
}
String needDate = new SimpleDateFormat("yyyy-MM-dd").format(endTime);
System.out.println("不算3月1号到:"+needDate+"满60个工作日。");
}
回来看了下楼上的答案,还真是巧妙 :idea:
[code="js"]
function getworkday(date,itervalByDay){
var millisceonds =date.getTime();
for(var i=1;i<=itervalByDay;i++){
millisceonds +=24*60*60*1000;
date.setTime(millisceonds);
if(date.getDay()==0||date.getDay()==6) i--;
}
return date;
}
[/code]
上面写的有点问题
那个参数名字写到一起去了。。。
结果有点问题哈。。。
楼上的很有意思,你写的明显跟我一样的思路,还说我写的好
:wink:
只能是说基本思路是一样的,差别还是蛮大的,比如我是3月1号开始,你的就不一定了,我计数只会增加,你是有加有减,初始设个1又出不了错,感觉很巧妙。
改这么快。。。
还好没说你参数多了。。。
[code="js"]
function getworkday(date,itervalByDay){
var millisceonds =date.getTime();
var zeroFlag =itervalByDay>0?1:-1;
for(var i=1;i<=itervalByDay*zeroFlag;i++){
millisceonds +=zeroFlag*24*60*60*1000;
date.setTime(millisceonds);
if(date.getDay()==0||date.getDay()==6) i--;
}
return date;
}
[/code]
这样就能算间隔为负数的了,不过范围仅限于1970年1月1日前
可以把工作日数除以5,商的部分是整周的,直接乘以7。这样,你只需要处理一下余数的部分就行了。
我的思路跟楼上的一样 也是这么想的
不过怎么判断余数部分 是不是正好是周末呢 还是kidding87写的比较好 学习一下
我的意思是说,可以先把商的部分直接乘以7,余数的部分再使用getDay()判断来一天一天往下推,没必要从一开始就这样。
恩恩 明白
[code="js"]
function getworkday(date,itervalByDay){
var millisceonds=date.getTime()+24*60*60*1000*parseInt(itervalByDay*7/5);
date.setTime(millisceonds);
while(date.getDay()==0||date.getDay()==6){
millisceonds +=24*60*60*1000*(itervalByDay<0?-1:1);
date.setTime(millisceonds);
}
return date;
}
[/code]
楼上的建议不错
建议是不错,但是,最后这个版本不行,测试不通过:
[code="js"]for (var i=-9;i<10 ; i++ )
{
alert(getworkday(new Date(),i));
}[/code]
还是用回第一个版本好点,简单:
[code="js"] function getworkday(date,itervalByDay){
var millisceonds =date.getTime();
for(var i=1;i<=itervalByDay;i++){
millisceonds +=24*60*60*1000;
date.setTime(millisceonds);
if(date.getDay()==0||date.getDay()==6) i--;
}
return date;
} [/code]
这里这么热闹,咋没人理会我提的问呢,都那么长时间了,大家帮忙看看哇 :cry:
http://www.iteye.com/problems/79583