PHP问题(7.28)在线给分! 两个值换成unix时间戳 跟着相减 得到之间的秒数....跟着除出天数..... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 貌似看了一下,觉得有点问题..2008-12-22 到 2008-12-29 有8天,可不包含周六和周日就只有六天,怎么会有六天呢? (6天或者5天)按你的意思肯定是一个星期加一天=8天,但加的那一天有可能是周日,那么就会出现2个周日和1个周六..这里需要考虑一下..代码不是关键,关键是思路...LZ的意思是不是如果是7天就减2天双休那么,8,9,....13,怎么算,也只算一个周日和一个周六?那么,14天就是2个周日和2个周六...$days = "日期相减得到的天数";if($days%7 ==1){ $days = $days-2;return $days;}if($days%7 ==2){ $days = $days-4;return $days;}......依次类推 同意LS 我的思路就是跟不上啊,发现不了规律 呵呵 <?php $strStart = '2008-12-22'; $strEnd = '2008-12-29'; $timeStart = strtotime($strStart); $timeEnd = strtotime($strEnd); $total = $timeEnd-$timeStart; $out = 0; $oneDay = 24*60*60; //判断 while(1) { $arrStart = getdate($timeStart); if($timeStart<=$timeEnd) { if($arrStart['wday']==0||$arrStart['wday']==6) { ++$out; } $timeStart += $oneDay; } else break; } if($total>0) { $total = $total - $out*$oneDay; $count = $total/$oneDay; } //echo $count;?> 谢谢3楼,就每遇周六或日都休假的意思,你上面的算法还可这样写:for(i=0;i<52;i++;){if($days%7 ==i){ $days = $days-2i;return $days;}}可你怎么知道今天是星期几呢,要是今天是星期五,就是请四天中也会减二天呀,又应该如何处理呢, 呵呵,我的意思和你说的差不多...我写的那段代码是你理想化的情况下才能用到的..请假必须用星期一开始.考虑其他情况的话就必须用到date('l');//Sunday 到 Saturday来判断今天是星期几再用while()....case 来筛选 4楼的算法有误,我是要 每遇周六或日都休假的意思, 你的算法中我用了 $strStart = '2008-07-01'; $strEnd = '2008-07-07';做测试,输出的是4,不对呀,应该5呀,你可能是没有判断好 星期几的问题,再帮我修改下,(2009-01-01是周四),时间都用09-01-01年以后的吧,谢谢 LZ 我的方法很乱吗,我只是笨笨的把所有日期拉出来判断下,应该都看的懂才对你最后if($total>0) { $total = $total+$oneday-$out*$oneDay; $count = $total/$oneDay; }试试 if($total>0) { $total = $total+$oneDay-$out*$oneDay; $count = $total/$oneDay; } 对了,就是这一天的问题。谢谢楼上的,加下小弟的MSN:[email protected] 发表于:2008-07-28 11:21:064楼 得分:0 同意LS 我的思路就是跟不上啊,发现不了规律 呵呵 PHP code<?php $strStart = '2008-12-22'; $strEnd = '2008-12-29'; $timeStart = strtotime($strStart); $timeEnd = strtotime($strEnd); $total = $timeEnd-$timeStart; //这里就应加一天,要不下面的判断就有问题if($total>0); $out = 0; $oneDay = 24*60*60; //判断 while(1) { $arrStart = getdate($timeStart); if($timeStart<=$timeEnd) { if($arrStart['wday']==0||$arrStart['wday']==6) { ++$out; } $timeStart += $oneDay; } else break; } if($total>0) { $total = $total - $out*$oneDay; $count = $total/$oneDay; } //echo $count;?> 公司不让上MSN,没办法,我住的地方又没电脑......郁闷/... <?phpfunction dif_date($start_date,$end_date){ $start_ar=explode("-",$start_date); $end_ar=explode("-",$end_date); $start_time=mktime(0,0,0,$start_ar[1],$start_ar[2],$start_ar[0]); $end_time=mktime(0,0,0,$end_ar[1],$end_ar[2]+1,$end_ar[0]); $dif_time=$end_time-$start_time; $dif_days=ceil($dif_time/(24*60*60)); $start_weekday=date("N",$start_time); $mod_val=$dif_days%7; $up_limit=$start_weekday+$mod_val; $other_dif=0; for($j=$start_weekday;$j<$up_limit;$j++){ $tmp_val=$j%7; if($tmp_val==0 || $tmp_val==6){ $other_dif++; } } $week_dif=(floor($dif_days/7))*2; $res_dif=$dif_days-$week_dif-$other_dif; return $res_dif;}$res_dif=dif_date("2008-7-1",'2008-7-31');echo $res_dif;?> 如果我还有一函数function public_day($tsDate) 这函数(已封装好)用来得到国家 公共节假日,那在我上面的$total函数中,怎么减去这些假呀,<?php $strStart = '2008-12-22'; $strEnd = '2008-12-29'; $timeStart = strtotime($strStart); $timeEnd = strtotime($strEnd); $total = $timeEnd-$timeStart; $out = 0; $oneDay = 24*60*60; while(1) { $arrStart = getdate($timeStart); if($timeStart<=$timeEnd) { if($arrStart['wday']==0||$arrStart['wday']==6) { ++$out; } $timeStart += $oneDay; } else break; } if($total>0) { $total = $total+oneDay - $out*$oneDay; $count = $total/$oneDay; } //echo $count;?>就在这代码上修改。。谢谢了。 <?php $strStart = '2008-12-22'; $strEnd = '2008-12-29'; $timeStart = strtotime($strStart); $timeEnd = strtotime($strEnd); $total = $timeEnd-$timeStart; $out = 0; $oneDay = 24*60*60; while(1) { $arrStart = getdate($timeStart); if($timeStart <=$timeEnd) { if($arrStart['wday']==0 ¦ ¦$arrStart['wday']==6) { ++$out; } $timeStart += $oneDay; } else break; } if($total>0) { $total = $total+oneDay - $out*$oneDay; $count = $total/$oneDay; } //echo $count; ?> 这个函数得到的 $count 是去掉了双休的,只是还有些国家公共节假日没考虑,这function public_day($tsDate)是用来得到公共节假日的,可直接调用的函数,就是怎么把二个函数结合起来用,得到的天数中既没有双休,又没有公共节假日,天数也可算对, 不用,在这function public_day($tsDate)已都考虑好,只把这二函数连起来就行了, 你public_day得到的参数$tsDate是什么?返回的又是什么? fuction public_day{ if((date('m',$tsDate)==1 && date('d',$tsDate)==1) || (date('m',$tsDate)==5 && (date('d',$tsDate)==1)) || date('m',$tsDate)==10 && (date('d',$tsDate)==1 || date('d',$tsDate)==2 || date('d',$tsDate)==3)){ // 1-1 5-1 10-1 10-2 10-3 return 0;上面是判断 1-1 5-1 10-1 10-2 10-3 放假 ,其它的与这个同理,$tsDate就是date('m',$tsDate)中的 $tsDate,返回值都是0 或1,在其它地方这样调用,成功过: $cur_date=strtotime($start_date); $i=1; while($i<=$days){ if($this->public_day($cur_date)){ if($i==1) $start_date=date("Y-m-d",$cur_date); $i++; if(!public_day($timeStart)||$arrStart['wday']==0 ||$arrStart['wday']==6) 六道之纹可以写下你的MSN吗,加我的也可以,[email protected]注明CSDN谢谢你。 刚开始学PHP,所以代码上面没办法帮忙,只能说说我的思路假设每周从周一开始,周日结束(data函数应该能取得1-7的表示星期几的数字)首先算出时间差的天数以及开始的星期数,然后规整去头,也就是将下个周一前的天数去掉,着就变成包含一个双休的一段时间然后将剩余的天数用7取整取余后分成2段,一段是包含完整7天的周数X(取整后舍弃小数),一段是最后不完整的一周天数Y(也可能取整后没有余数)最后将计算中的双休天数,如果Y>5的话,说明最后包含双休的天数,2+X*2+(Y-5),否则2+X*2(忽略Y) 尝试写了下,不知道可以不可以,基本没用什么流程控制的代码,就一个IF判断,应该是很简单吧....<?php //起止时间 $strStart = '2008-12-22'; $strEnd = '2008-12-29'; $out = 0; //计算日期差 $timeStart = strtotime($strStart); $timeEnd = strtotime($strEnd); $total = $timeEnd-$timeStart; echo "日期间相差 $total 秒<br />"; $oneDay = 24*60*60; $total=$total/$oneDay+1; echo "日期间相差 $total 天<br />"; //起始日期的星期数,周一起算1-7 $WeekDay=date(N,$timeStart); echo "起始日期星期 $WeekDay<br />"; //以周日为结束,起始日期所在周的天数 $firstDays=8-$WeekDay; echo "第一周天数 $firstDays<br />"; //祛除首周后的剩余天数 $out=$total-$firstDays; //周一至周日完整周数 $Weeks=($out-$out%7)/7; echo "剩余完整周数量 $Weeks<br />"; //最后一个不完整周的天数 $other=$out%7; echo "最后周天数 $other<br />"; //计算总假日数,不包括非双休假日 $Holiday=2+ $Weeks*2; if($other>5) $Holiday += 2; echo "双休假日总天数 $Holiday<br />"; //日期差天数减去假日天数 $total=$total-$Holiday; echo "非双休日数 $total<br />"; ?> <?php$start_date = "2008-10-12";$end_date = "2008-12-10";function getWorkDate($start, $end){ $result[0] = 0; while($start < $end){ $week = date("w", strtotime($start)); if($week > 0 && $week < 6){ $result[0] ++; $result[] = $start; } $start = date("Y-m-d", strtotime($start) + 3600 * 24); } return $result;}print_r(getWorkDate($start_date, $end_date));?>如果2008-12-10 到2008-12-11 算一天就用上边方法,如果算两天就把$start < $end 改为 $start <= $end 我的MSN:[email protected]不常用MSN我也在学,一起努力吧 哪位能给我一个PHP+XAJAX的进度条的例子 关于svg php 判断登陆验证码是否正确问题... 如何从数据库中读取某字段跟分类呢? php 文本内容中发现无效字符 因网上的多为说不清楚 求一3级级联 php+js iconv问题,不知道如何解决 幼稚问题,字段相加 如果去掉html代码自动回车后的<br /> while嵌套while只输出一次? 数据库乱码 php新手问题
2008-12-22 到 2008-12-29 有8天,
可不包含周六和周日就只有六天,
怎么会有六天呢? (6天或者5天)
按你的意思肯定是一个星期加一天=8天,
但加的那一天有可能是周日,那么就会出现2个周日和1个周六..这里需要考虑一下..代码不是关键,关键是思路...LZ的意思是不是如果是7天就减2天双休
那么,8,9,....13,怎么算,也只算一个周日和一个周六?那么,14天就是2个周日和2个周六...
$days = "日期相减得到的天数";if($days%7 ==1){
$days = $days-2;
return $days;
}if($days%7 ==2){
$days = $days-4;
return $days;
}
......依次类推
$strStart = '2008-12-22';
$strEnd = '2008-12-29';
$timeStart = strtotime($strStart);
$timeEnd = strtotime($strEnd);
$total = $timeEnd-$timeStart;
$out = 0;
$oneDay = 24*60*60;
//判断
while(1)
{
$arrStart = getdate($timeStart);
if($timeStart<=$timeEnd)
{
if($arrStart['wday']==0||$arrStart['wday']==6)
{
++$out;
}
$timeStart += $oneDay;
}
else break;
} if($total>0)
{
$total = $total - $out*$oneDay;
$count = $total/$oneDay;
}
//echo $count;
?>
就每遇周六或日都休假的意思,
你上面的算法还可这样写:for(i=0;i<52;i++;){if($days%7 ==i){
$days = $days-2i;
return $days;
}}可你怎么知道今天是星期几呢,
要是今天是星期五,就是请四天中也会减二天呀,
又应该如何处理呢,
我写的那段代码是你理想化的情况下才能用到的..请假必须用星期一开始.考虑其他情况的话就必须用到
date('l');//Sunday 到 Saturday
来判断今天是星期几
再用while()....case 来筛选
我是要 每遇周六或日都休假的意思,
你的算法中我用了
$strStart = '2008-07-01';
$strEnd = '2008-07-07';
做测试,输出的是4,
不对呀,应该5呀,
你可能是没有判断好 星期几的问题,
再帮我修改下,(2009-01-01是周四),
时间都用09-01-01年以后的吧,
谢谢
你最后if($total>0)
{
$total = $total+$oneday-$out*$oneDay;
$count = $total/$oneDay;
}试试
if($total>0)
{
$total = $total+$oneDay-$out*$oneDay;
$count = $total/$oneDay;
}
就是这一天的问题。
谢谢楼上的,
加下小弟的MSN:
[email protected]
发表于:2008-07-28 11:21:064楼 得分:0
同意LS 我的思路就是跟不上啊,发现不了规律 呵呵 PHP code
<?php
$strStart = '2008-12-22';
$strEnd = '2008-12-29';
$timeStart = strtotime($strStart);
$timeEnd = strtotime($strEnd);
$total = $timeEnd-$timeStart;
//这里就应加一天,要不下面的判断就有问题if($total>0);
$out = 0;
$oneDay = 24*60*60;
//判断
while(1)
{
$arrStart = getdate($timeStart);
if($timeStart<=$timeEnd)
{
if($arrStart['wday']==0||$arrStart['wday']==6)
{
++$out;
}
$timeStart += $oneDay;
}
else break;
} if($total>0)
{
$total = $total - $out*$oneDay;
$count = $total/$oneDay;
}
//echo $count;
?>
郁闷/...
function dif_date($start_date,$end_date){
$start_ar=explode("-",$start_date);
$end_ar=explode("-",$end_date);
$start_time=mktime(0,0,0,$start_ar[1],$start_ar[2],$start_ar[0]);
$end_time=mktime(0,0,0,$end_ar[1],$end_ar[2]+1,$end_ar[0]);
$dif_time=$end_time-$start_time;
$dif_days=ceil($dif_time/(24*60*60));
$start_weekday=date("N",$start_time);
$mod_val=$dif_days%7;
$up_limit=$start_weekday+$mod_val;
$other_dif=0;
for($j=$start_weekday;$j<$up_limit;$j++){
$tmp_val=$j%7;
if($tmp_val==0 || $tmp_val==6){
$other_dif++;
}
}
$week_dif=(floor($dif_days/7))*2;
$res_dif=$dif_days-$week_dif-$other_dif;
return $res_dif;
}$res_dif=dif_date("2008-7-1",'2008-7-31');
echo $res_dif;
?>
function public_day($tsDate) 这函数(已封装好)
用来得到国家 公共节假日,那在我上面的$total函数中,怎么减去这些假呀,
<?php
$strStart = '2008-12-22';
$strEnd = '2008-12-29';
$timeStart = strtotime($strStart);
$timeEnd = strtotime($strEnd);
$total = $timeEnd-$timeStart;
$out = 0;
$oneDay = 24*60*60;
while(1)
{
$arrStart = getdate($timeStart);
if($timeStart<=$timeEnd)
{
if($arrStart['wday']==0||$arrStart['wday']==6)
{
++$out;
}
$timeStart += $oneDay;
}
else break;
} if($total>0)
{
$total = $total+oneDay - $out*$oneDay;
$count = $total/$oneDay;
}
//echo $count;
?>就在这代码上修改。。
谢谢了。
$strStart = '2008-12-22';
$strEnd = '2008-12-29';
$timeStart = strtotime($strStart);
$timeEnd = strtotime($strEnd);
$total = $timeEnd-$timeStart;
$out = 0;
$oneDay = 24*60*60;
while(1)
{
$arrStart = getdate($timeStart);
if($timeStart <=$timeEnd)
{
if($arrStart['wday']==0 ¦ ¦$arrStart['wday']==6)
{
++$out;
}
$timeStart += $oneDay;
}
else break;
} if($total>0)
{
$total = $total+oneDay - $out*$oneDay;
$count = $total/$oneDay;
}
//echo $count;
?>
这个函数得到的 $count 是去掉了双休的,
只是还有些国家公共节假日没考虑,
这function public_day($tsDate)是用来得到公共节假日的,
可直接调用的函数,
就是怎么把二个函数结合起来用,得到的天数中既没有双休,又没有公共节假日,天数也可算对,
在这function public_day($tsDate)已都考虑好,
只把这二函数连起来就行了,
if((date('m',$tsDate)==1 && date('d',$tsDate)==1) || (date('m',$tsDate)==5 && (date('d',$tsDate)==1)) || date('m',$tsDate)==10 && (date('d',$tsDate)==1 || date('d',$tsDate)==2 || date('d',$tsDate)==3)){
// 1-1 5-1 10-1 10-2 10-3
return 0;
上面是判断 1-1 5-1 10-1 10-2 10-3 放假 ,其它的与这个同理,$tsDate就是date('m',$tsDate)中的 $tsDate,返回值都是0 或1,在其它地方这样调用,成功过:
$cur_date=strtotime($start_date);
$i=1;
while($i<=$days){
if($this->public_day($cur_date)){
if($i==1)
$start_date=date("Y-m-d",$cur_date);
$i++;
if(!public_day($timeStart)||$arrStart['wday']==0 ||$arrStart['wday']==6)
可以写下你的MSN吗,
加我的也可以,
[email protected]
注明CSDN
谢谢你。
假设每周从周一开始,周日结束(data函数应该能取得1-7的表示星期几的数字)
首先算出时间差的天数以及开始的星期数,然后规整去头,也就是将下个周一前的天数去掉,着就变成包含一个双休的一段时间
然后将剩余的天数用7取整取余后分成2段,一段是包含完整7天的周数X(取整后舍弃小数),一段是最后不完整的一周天数Y(也可能取整后没有余数)
最后将计算中的双休天数,如果Y>5的话,说明最后包含双休的天数,2+X*2+(Y-5),否则2+X*2(忽略Y)
<?php //起止时间
$strStart = '2008-12-22';
$strEnd = '2008-12-29';
$out = 0; //计算日期差
$timeStart = strtotime($strStart);
$timeEnd = strtotime($strEnd);
$total = $timeEnd-$timeStart;
echo "日期间相差 $total 秒<br />"; $oneDay = 24*60*60;
$total=$total/$oneDay+1;
echo "日期间相差 $total 天<br />";
//起始日期的星期数,周一起算1-7
$WeekDay=date(N,$timeStart);
echo "起始日期星期 $WeekDay<br />";
//以周日为结束,起始日期所在周的天数
$firstDays=8-$WeekDay;
echo "第一周天数 $firstDays<br />";
//祛除首周后的剩余天数
$out=$total-$firstDays;
//周一至周日完整周数
$Weeks=($out-$out%7)/7;
echo "剩余完整周数量 $Weeks<br />";
//最后一个不完整周的天数
$other=$out%7;
echo "最后周天数 $other<br />"; //计算总假日数,不包括非双休假日
$Holiday=2+ $Weeks*2;
if($other>5)
$Holiday += 2;
echo "双休假日总天数 $Holiday<br />";
//日期差天数减去假日天数
$total=$total-$Holiday;
echo "非双休日数 $total<br />";
?>
$start_date = "2008-10-12";
$end_date = "2008-12-10";function getWorkDate($start, $end){
$result[0] = 0;
while($start < $end){
$week = date("w", strtotime($start));
if($week > 0 && $week < 6){
$result[0] ++;
$result[] = $start;
}
$start = date("Y-m-d", strtotime($start) + 3600 * 24);
} return $result;
}print_r(getWorkDate($start_date, $end_date));
?>如果2008-12-10 到2008-12-11 算一天就用上边方法,如果算两天就把$start < $end 改为 $start <= $end
不常用MSN
我也在学,一起努力吧