最近项目中要用到这样一个功能,计算N个工作日之后的日期,现在想到如下方案感觉可以解决问题。
这个说明下,工作日还是按照国家规定的来算的,就是周一到周五、法定假期前后调休需上班的都算作工作日,周六、周日和法定假日则不算工作日,法定假日和调休上班的日期可存在数据库中进行维护。
代码如下,感觉效率不算很高,如有更好的办法,还请高人分享一下。
<?<span php date_default_timezone_set(</span>"Asia/Shanghai");<span //</span><span 设置好一个时区</span> <span $now</span>=<span mktime</span>(0, 0, 0,8,1,2013);<span //</span><span 开始的日期,可以是现在或其他你想要的某一个日期的时间戳,这里设置2013-08-01</span> <span $i</span>=10;<span //</span><span 要求计数的工作日数量</span> <span /*</span><span 国家法定假日一般可以存储在数据库中进行维护,包括休假的日期,和周末调休上班的日期两类,作为演示对应日期暂时放在数组中</span><span */</span> <span $working</span>=<span array</span>(<span mktime</span>(0, 0, 0,8,3,2013),<span mktime</span>(0, 0, 0,8,11,2013));<span //</span><span 周末调休上班的日期</span> <span $holiday</span>=<span array</span>(<span mktime</span>(0, 0, 0,8,8,2013),<span mktime</span>(0, 0, 0,8,6,2013));<span //</span><span 法定假期</span> <span $day</span>=<span date</span>("d",<span $now</span>);<span //</span><span 把当天的日期给一个变量</span> <span $w</span>=0;<span //</span><span 工作日计数变量</span> <span while</span>(<span $w</span><<span $i</span>){<span //</span><span 当达到要求的工作日数量则停止循环</span> <span $newdate</span>=<span mktime</span>(0, 0, 0,<span date</span>("m",<span $now</span>),++<span $day</span>,<span date</span>("Y",<span $now</span>));<span //</span><span 加一天输出新的时间戳</span> <span if</span>(<span in_array</span>(<span $newdate</span>, <span $working</span>)){<span //</span><span 判断一下,如果属于调休的则工作日计数加一,如果法定假日调休存在数据库中,则这里需要一条查询语句来查询一下</span> <span $w</span>++<span ; }</span><span else</span>{<span //</span><span 如不属于调休的则再进行判断,既不是周六周日,也不是法定假日,则工作日计数再加上一</span> <span if</span>(<span date</span>("w",<span $newdate</span>)!=0&&<span date</span>("w",<span $newdate</span>)!=6&&!<span in_array</span>(<span $newdate</span>, <span $holiday</span><span )){ </span><span $w</span>++<span ; } } } </span><span echo</span> <span date</span>("Y-m-d",<span $newdate</span>);<span //</span><span 最后得出的时间戳就是要求的10个工作日后的日期了。</span> ?>