如何通过PHP中的日期识别偶数或奇数星期六

如何通过PHP中的日期识别偶数或奇数星期六,php,Php,我想计算两个日期之间的总工作日数。 在这里,我们将第二个和第四个星期六作为工作日(即所有偶数星期六都视为假日) 我可以使用下面的代码获得特定日期的日期 $day = ‘2015-11-07’; $dayName = date("l",strtotime($day)); if ($dayName =='saturday') { ... } 然后,我必须找出那个特定的日期是属于11月的第一个星期六还是第二个星期六。 这样做有什么选择吗 我有代码来计算总天数,不包括所有周六、周日和节假日。

我想计算两个日期之间的总工作日数。 在这里,我们将第二个和第四个星期六作为工作日(即所有偶数星期六都视为假日) 我可以使用下面的代码获得特定日期的日期

$day = ‘2015-11-07’;
$dayName = date("l",strtotime($day));

if ($dayName =='saturday') {
    ...
}
然后,我必须找出那个特定的日期是属于11月的第一个星期六还是第二个星期六。 这样做有什么选择吗

我有代码来计算总天数,不包括所有周六、周日和节假日。我从你那里得到了密码

但我想确定哪怕是星期六,我会在总天数中检测到该星期六。

给你:

<?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");
}
?>

获取两个终点之间的所有天数,然后对每个终点应用您的逻辑,累积匹配的天数:

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;
}

提到代码你得到了什么结果?我得到了“星期六”。我怎样才能确定这是那个月的第一个星期六?你能写下样本输入和样本输出吗?所以你要寻找一个月内的偶数和奇数星期六,而不是一年内的,所以你连续有两个星期六休息,10月31日和11月7日?11月7日是一个月的第一周,但却是一年中的第45周。这两种情况都很奇怪,但10月份的星期六就不是这样了,第一个星期六是在第40周。看起来“偶数”或“奇数”是相对于月份的几周,而不是一年中的几周。也就是说,一个月的第一个星期六总是奇数。@CompuChip
date('j',$timestamp)
将始终返回一个介于1和7之间的数字,包括一个月的第一个星期六,该数字将标识为奇数星期六。我认为这是OP想要的…它被排除在结束日期之外。如果结束日期是星期六,那么我也必须检查它。例如,如果我想检查11月1日和11月14日,那么工作日将是11天(在我的情况下),但返回10天。因为它排除了结束日期,所以在foreach循环本身中它不会出现。@Anu是的,这是DatePeriod的正常行为。或者,如果你愿意,把它放在方法中。我在这里做了后者。
    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