【发布时间】:2008-09-17 06:28:36
【问题描述】:
标题几乎是不言自明的。给定两个日期,使用 PHP 查找工作日天数的最佳方法是什么?工作日为周一至周五。
例如,我如何知道31/08/2008 和13/09/2008 之间有10 个工作日?
【问题讨论】:
标题几乎是不言自明的。给定两个日期,使用 PHP 查找工作日天数的最佳方法是什么?工作日为周一至周五。
例如,我如何知道31/08/2008 和13/09/2008 之间有10 个工作日?
【问题讨论】:
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
$difference = $dateto - $datefrom;
$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); // Complete weeks
$first_day = date("w", $datefrom);
$days_remainder = floor($days_difference % 7);
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
if ($odd_days > 7) { // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
【讨论】:
如果您要创建发票系统,则必须考虑银行假期、复活节等。计算起来并不简单。
我见过的最好的解决方案是预先生成一个包含天数及其类型的表到 SQL 数据库(每天行 = 每年 365 行),然后使用适当的选择(WHERE 子句)执行简单的计数查询。
您可以在 Joe Celko 的 Thinking in Sets: Auxiliary, Temporal, and Virtual Tables in SQL中找到该解决方案的完整描述
【讨论】:
一种方法是使用 strtotime(...) 将日期转换为 unix 时间戳,减去结果并使用 86400 (24*60*60) 进行除法:
$dif_in_seconds = abs(strtotime($a) - strtotime($b));
$daysbetween = $dif_in_seconds / 86400;
ETA:哦..你的意思是周一至周五的工作日..一开始没看到..
【讨论】:
最好的方法是遍历给定日期范围内的所有日期,并获取每个日期的星期几。如果是工作日,请增加某个计数器。在该过程结束时,您将获得工作日数。
PHP 函数 mktime() 和 date()(用于处理 UNIX 时间戳)是您的朋友。
【讨论】: