計(jì)算一段日期內(nèi)的周末天數(shù)的php代碼(星期六,星期日總和)
更新時(shí)間:2009年11月12日 20:29:31 作者:
算法沒什么難點(diǎn),核心思想就是將這個(gè)時(shí)間段調(diào)整為7的整數(shù),然后乘以2,在減去或加上多算和少算的周六或周日,得到的就是星期六和星期日的總和。
復(fù)制代碼 代碼如下:
/*
| Author: Yang Yu <niceses@gmail.com>
| @param char|int $start_date 一個(gè)有效的日期格式,例如:20091016,2009-10-16
| @param char|int $end_date 同上
| @return 給定日期之間的周末天數(shù)
*/
function get_weekend_days($start_date,$end_date){
if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date);
$start_reduce = $end_add = 0;
$start_N = date('N',strtotime($start_date));
$start_reduce = ($start_N == 7) ? 1 : 0;
$end_N = date('N',strtotime($end_date));
in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1;
$days = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1;
return floor(($days + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add;
}
備注:
最近寫給公司用的考勤系統(tǒng),把其中的一個(gè)功能自動(dòng)化,就是每個(gè)月的工作日(出勤天數(shù))改為自動(dòng)寫入,于是寫出以上函數(shù),用來計(jì)算兩個(gè)日期內(nèi)的周六周日總數(shù),稍微解釋下吧,這個(gè)功能當(dāng)然是用循環(huán)實(shí)現(xiàn)是最簡(jiǎn)單的,從開始那天for到結(jié)束那天,中間只要是周六或周日,就++,最后輕易算出總和,但還是那句話,循環(huán)的效率實(shí)在是不好,尤其當(dāng)時(shí)間跨度過長(zhǎng)時(shí),慘不忍睹。
我這個(gè)函數(shù)的基本思路是四個(gè)字:前補(bǔ)后砍。沒聽懂吧?我也覺得有點(diǎn)莫名其妙。。。就是取得開始日期的星期數(shù),如果不足一周,則補(bǔ)上對(duì)應(yīng)的天數(shù),比如開始日期是星期3,那么總天數(shù)就補(bǔ)上2天(星期1,星期2),如果開始日期是星期6,則補(bǔ)上5天,也就是6-1,就是函數(shù)中的$start_N - 1,如果開始日期恰好是周日,那么補(bǔ)上6天的同時(shí),最后的結(jié)果需要減去一天(周六),也就是函數(shù)中的 $start_reduce ,好了,現(xiàn)在“前補(bǔ)”解釋完了。下面講下“后砍”,顧名思義,就是將后面多余的不足一周的天數(shù),砍掉,例如,結(jié)束日期為星期3,那么就從總天數(shù)里減去3天,如果結(jié)束日期為星期6或者星期天,那么減去6或7的同時(shí),還要在最后補(bǔ)上1或2。
算法沒什么難點(diǎn),核心思想就是將這個(gè)時(shí)間段調(diào)整為7的整數(shù),然后乘以2,在減去或加上多算和少算的周六或周日,得到的就是星期六和星期日的總和。最后算一段時(shí)間內(nèi)的天數(shù),不建議用date(z)來算,因?yàn)橥ㄓ眯詴?huì)不好,涉及到跨年的問題,如果跨多年,還要考慮閏年的問題,倒不如這樣算來的直接。
改進(jìn)記錄,加入$is_workday 參數(shù),可以選擇是否返回工作日,默認(rèn)是返回休息日
復(fù)制代碼 代碼如下:
function get_weekend_days($start_date,$end_date,$is_workday = false){
if (strtotime($start_date) > strtotime($end_date)) list($start_date, $end_date) = array($end_date, $start_date);
$start_reduce = $end_add = 0;
$start_N = date('N',strtotime($start_date));
$start_reduce = ($start_N == 7) ? 1 : 0;
$end_N = date('N',strtotime($end_date));
in_array($end_N,array(6,7)) && $end_add = ($end_N == 7) ? 2 : 1;
$alldays = abs(strtotime($end_date) - strtotime($start_date))/86400 + 1;
$weekend_days = floor(($alldays + $start_N - 1 - $end_N) / 7) * 2 - $start_reduce + $end_add;
if ($is_workday){
$workday_days = $alldays - $weekend_days;
return $workday_days;
}
return $weekend_days;
}
您可能感興趣的文章:
- PHP實(shí)現(xiàn)今天是星期幾的幾種寫法
- PHP獲取指定日期是星期幾的實(shí)現(xiàn)方法
- PHP獲取星期幾的常用方法小結(jié)
- PHP獲取日期對(duì)應(yīng)星期、一周日期、星期開始與結(jié)束日期的方法
- php獲取本周星期一具體日期的方法
- PHP計(jì)算一年多少個(gè)星期和每周的開始和結(jié)束日期
- PHP獲取當(dāng)前日期所在星期(月份)的開始日期與結(jié)束日期(實(shí)現(xiàn)代碼)
- php實(shí)現(xiàn)按天數(shù)、星期、月份查詢的搜索框
- PHP獲取一年中每個(gè)星期的開始和結(jié)束日期的方法
- php獲取是星期幾的的一些常用姿勢(shì)
相關(guān)文章
利用PHP實(shí)現(xiàn)智能文件類型檢測(cè)的實(shí)現(xiàn)代碼
通常我們想嚴(yán)格限制文件類型的時(shí)候,可以簡(jiǎn)單地用$_FILES['myFile']['type'] 取得文件的 MIME類型然后來檢測(cè)它是否是合法的類型。2011-08-08php源碼加密 仿微盾PHP加密專家(PHPCodeLock)
php源碼加密 仿照 微盾PHP加密專家(PHPCodeLock),需要的朋友可以參考下。2010-05-05PHP日期函數(shù)date格式化UNIX時(shí)間的方法
這篇文章主要介紹了PHP日期函數(shù)date格式化UNIX時(shí)間的方法,實(shí)例分析了php中date函數(shù)的使用技巧,需要的朋友可以參考下2015-03-03