我想计算两个日期之间的总工作天数。在这里,我们将第二个和第四个星期六作为工作日(即所有偶数星期六都视为假日)我可以通过使用以下代码获得特定日期的日期
$day = ‘2015-11-07’;
$dayName = date("l",strtotime($day));
if ($dayName =='saturday') {
...
}
那么我必须弄清楚那个特定的日期是11月的第一个星期六还是第二个星期六。这样做有什么选择吗?
我有计算总天数的代码,不包括所有周六、周日和节假日。我从另一个问题得到了那个代码
但我想确定哪怕是星期六,我会在总天数中检测到那个星期六。
获取两个端点之间的所有天数,然后将您的逻辑应用于每个端点,累积匹配的值:
function work_days_between_two_dates(DateTime $begin, DateTime $end) {
$workdays = [];
$all_days = new DatePeriod($begin, new DateInterval('P1D'), $end->modify('+1 day'));
foreach ($all_days as $day) {
$dow = (int)$day->format('w');
$dom = (int)$day->format('j');
if (1 <= $dow && $dow <= 5) { // Mon - Fri
$workdays[] = $day;
} else if (6 == $dow && 0 == $dom % 2) { // Even Saturday
$workdays[] = $day;
}
}
return $workdays;
}
活生生的例子。
对于2015年11月(日期在11/1和12/1之间),此算法将以下标记为工作日:
November 2015
Su Mo Tu We Th Fr Sa
- 2 3 4 5 6 -
- 9 10 11 12 13 14
- 16 17 18 19 20 -
- 23 24 25 26 27 28
- 30
开始:
<?php
$day = '2015-11-14';
$timestamp = strtotime($day);
$dayOfWeek = date('w', $timestamp); //0-6, 6 = Saturday
$dayOfMonth = date('j', $timestamp); //1-31
$weekNum = ceil($dayOfMonth / 7); //round up to get the week number
if ($dayOfWeek == 6) { //first check the day of the week is a Saturday
if ($weekNum % 2 == 0) { //check that the week number is even
print("Even Saturday");
} else {
print("Odd Saturday");
}
} else {
print("Other day");
}
?>