0

我正在构建一个脚本来检测某些日期是否每年都在周末。

25 日和 26 日是银行假日,如果是周末,则下一个工作日替代该银行假日,其余工作日为工作日。

示例:如果 25 日是星期六,26 日是星期日,则 27 日和 28 日为银行假日,然后 29 日、30 日、31 日为工作日

如果 25 日是星期日,则 26 日和 27 日将是银行假期,28 日、29 日、30 日将是工作日,31 日将是星期六。

这是我的日期:

date('25-12-Y');
date('26-12-Y');
date('27-12-Y');
date('28-12-Y');
date('29-12-Y');
date('30-12-Y');
date('31-12-Y');

我创建的代码是这样的:(请注意 $getyear 变量是为了测试不同的年份)

function isWeekend($date) {
    return (date('N', strtotime($date)) >= 6);
}
$getyear = 2013;

echo '25 ';
if (isWeekend(date('25-12-'.$getyear))){
   echo 'weekend'; 
} else {
    echo 'bh';
};
echo '<br>';
echo '26 ';
if (isWeekend(date('26-12-'.$getyear ))){
    echo 'weekend';
} else {
    echo 'bh';
};
echo '<br>';
echo '27 ';
if (isWeekend(date('27-12-'.$getyear ))){
    echo 'weekend'; 
} else { 
    echo 'leave';
};
echo '<br>';
echo '28 ';
if (isWeekend(date('28-12-'.$getyear ))){
    echo 'weekend'; 
} else {
    echo 'leave';
};
echo '<br>';
echo '29 ';
if (isWeekend(date('29-12-'.$getyear ))){
    echo 'weekend'; 
} else {
    echo 'leave';
};
echo '<br>';
echo '30 ';
if (isWeekend(date('30-12-'.$getyear ))){
    echo 'weekend'; 
} else {
    echo 'leave';
};
echo '<br>';
echo '31 ';
if (isWeekend(date('31-12-'.$getyear ))){
    echo 'weekend'; 
} else {
    echo 'leave';
};
echo '<br>';

我知道这可能不是最佳实践,所以我正在寻找一种替代方法来解决这个问题。

4

3 回答 3

1
$dates = array();
$christmas_days = array(25, 26);

$year = 2013;

for ($day = 25; $day <= 31; $day++)
{
    $dates[$day] = date($day . '-12-' . $year);
}



foreach ($dates as $day => $date)
{
    echo $day . ' ';
    if (isWeekend($date))
    {
        echo 'weekend';
        if (in_array($day, $christmas_days))
        {
            $bh_on_weekend++;
        }
    } 
    else
    {
        if ($bh_on_weekend > 0)
        {
            echo 'bh';
            $bh_on_weekend--;
        } 
        else
        {
            if (in_array($day, $christmas_days))
            {
                echo 'bh';
            } 
            else
            {
                echo 'leave';
            }
        }
    }
    echo '<br>';
}

function isWeekend($date)
{
    return (date('N', strtotime($date)) >= 6);
}

尝试在 DRY 方式上做尽可能少的重复。日期创建更具动态性。希望它以某种方式对您有所帮助,或者提供一个如何使其与众不同的想法。

2021年产出

25 weekend
26 weekend
27 bh
28 bh
29 leave
30 leave
31 leave
于 2013-11-14T11:42:17.387 回答
0

您应该使用Carbon来抽象所有这些逻辑。

然后你可以这样做:

$dt = Carbon::create(2013, 12, 25);
$dt->isWeekday(); // bool

Carbon 文档非常好,所以我相信您将能够找到您要查找的内容。

于 2013-11-14T12:03:49.673 回答
0

这个问题和答案现在很古老,但我今天遇到了这个特殊问题并提出了以下功能:

if (!function_exists('hasWeekend')) {
    function hasWeekend (\DateTime $dateOne, \DateTime $dateTwo, $weekendDays = ["6", "7"]) {
        $diff = $dateTwo->diff($dateOne)->format('%a');
        $weekend = false;

        while ($diff > 0) {
            $date = $dateTwo->sub(new \DateInterval('P1D'));
            $day = $date->format('N');
            if (in_array($day, $weekendDays)) {
                $weekend = true;
                break;
            }

            $diff--;
        }

        return $weekend;
    }
}

像这样使用它:

$hasWeekend = hasWeekend(new \DateTime('2019-11-25'), new \DateTime('2019-11-26'));
// $hasWeekend = false, Nov 25th is a Monday, Nov 26nd a Tuesday.

$hasWeekend = hasWeekend(new \DateTime('2019-11-27'), new \DateTime('2019-12-2'));
// $hasWeekend = true, December 2nd 2019 is a monday

如果由于某种原因您的周末不是周六和周日,您可以更改 $weekendDays 数组以表示不同的日子。

于 2019-11-25T20:31:35.237 回答