求计算一段时间(排除周末和节假日)的代码

klinghr 2009-08-29 12:03:36
要求:可以指定开始日期,经过一定天数(比如3-5天),计算出结束日期。

难点:周末和节假日必须排除在经过天数之外。比如8月27日(周4)开始,经过3天,本来应该是8月30日结束;但是8月29日是周6,8月30日是周日,这两天得排除,这样8月27日开始,经过3天,得出的结束时间应该是9月1日。

用函数、对象或是其他方式实现都可以。分不多,还希望各位大侠不吝赐教。
...全文
403 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lypfriends 2009-08-31
  • 打赏
  • 举报
回复
路过
tony-杨 2009-08-31
  • 打赏
  • 举报
回复
晕,

// 调用 c('2009-8-31', 15, $j);


// 节假日定义格式为
/* array('有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....]),
'有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....])
[, .....])
*/
// 参数说明 c(开始日期,需要计算的天数,节假日列表)
function c($start, $day=0, $j=array()){
$start = strtotime( $start );
$day = intval( $day < 1 );
if( $start < 1 || $day < 1 ) return 0;
$reday = 0;
for($i=0; $i<$day; $i++){
$temp = array(date('n', $start), date('j', $start));
$temp[]= isset($j[ $temp[0] ]) And in_array($temp[1], $j[ $temp[0] ]);
if( 0<>date('w',$start) And 6<>date('w',$start) And !$temp[2] ){
$reday++;
}
$start += 3600*24;
}
unset( $start, $day, $j, $i, $temp );
return $reday;
}

tony-杨 2009-08-31
  • 打赏
  • 举报
回复
刚刚发现,直接复制搞错一个地方,改过来
// 调用  c('2009-8-31', 15, $j);


// 节假日定义格式为
/* array('有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....]),
'有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....])
[, .....])
*/
// 参数说明 c(开始日期,需要计算的天数,节假日列表)
function c($start, $day=0, $j=array()){
$start = strtotime( $start );
$day = intval( $day );
if( $start < 1 || $day < 1 ) return 0;
$reday = 0;
for($i=0; $i<$day; $i++){
$temp = array(date('n', $start), date('j', $start));
$temp[]= isset($j[ $temp[0] ]) And in_array($temp[1], $j[ $temp[0] ]);
if( 0<>date(w,$nowDay_time) And 6<>date(w,$nowDay_time) And !$temp[2] ){
$reday++;
}
$start += 3600*24;
}
unset( $start, $day, $j, $i, $temp );
return $reday;
}
natici 2009-08-30
  • 打赏
  • 举报
回复
1楼的没真正了解楼主的意思吧?
tony-杨 2009-08-30
  • 打赏
  • 举报
回复

// 调用 c('2009-8-31', 15, $j);


// 节假日定义格式为
/* array('有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....]),
'有节假日的月份'=>array('节假日的具体日期','节假日的具体日期'[, .....])
[, .....])
*/
// 参数说明 c(开始日期,需要计算的天数,节假日列表)
function c($start, $day=0, $j=array()){
$start = strtotime( $start );
$day = intval( $day < 1 );
if( $start < 1 || $day < 1 ) return 0;
$reday = 0;
for($i=0; $i<$day; $i++){
$temp = array(date('n', $start), date('j', $start));
$temp[]= isset($j[ $temp[0] ]) And in_array($temp[1], $j[ $temp[0] ]);
if( 0<>date(w,$nowDay_time) And 6<>date(w,$nowDay_time) And !$temp[2] ){
$reday++;
}
$start += 3600*24;
}
unset( $start, $day, $j, $i, $temp );
return $reday;
}
tony-杨 2009-08-30
  • 打赏
  • 举报
回复
排除周末很好解决,关键是节假日,
你得一个个的把节假日放到排除列表中,然后跟当前日比较
blueforyou 2009-08-29
  • 打赏
  • 举报
回复
$start="2009-1-1";
$days=30; //指定天数
$wantDays=0; //实际天数(周末除外)
for($i=1;$i<=$days;$i++){
$nowDay_time=strtotime($start)+$i*86400;
if(date(w,$nowDay_time)!=5 && date(w,$nowDay_time)!=6) $wantDays++;
}
$end=date('Y-m-d',(strtotime($start)+$wantDays*86400));
echo $end;

直接手写的,自己测试下吧

21,887

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧