Получите 1-й рабочий день следующего месяца, исключая праздничные дни - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь вернуть 1-й рабочий день следующего месяца, который должен исключать обычные праздничные дни - я решил положиться на strototime(), поскольку это может помочь и циклически проходить по датам. Теперь возникает проблема, что strototime() может возвращать «первый день следующего месяца», но не на «второй день следующего месяца и т. Д.». Есть ли другой способ вернуть даты или я должен попытаться программно соединить эти даты?

Вот мой сценарий:

function getDODate() {
    // Dates to select:
    $dates = [
        "first day of next month",
        "second day of next month",
        "third day of next month",
        "forth day of next month",
        "fifth day of next month",
        "sixth day of next month",
        "seventh day of next month"
    ];

    // public holidays:
    $publicHolidays = ['0101', '0501'];

    foreach ($dates AS $day) {
        // Get the dates for check:
        $monthDay = date("md", strtotime($day));
        $dayName = date("l", strtotime($day));
        echo $monthDay."<br />";
        // First, let's get the date to ensure it's not a public holiday:
        if (!in_array($monthDay, $publicHolidays)) {
            // Date does not fall on a public holiday, is it a weekend?
            if (!in_array($dayName, ['Saturday', 'Sunday'])) {
                // We've got a date that will work, return:
                return date("Ymd", strtotime($day));
            }
        }
    }
}

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вам нужно проверять несколько раз, так как увеличение даты с выходных на будний день может привести к выходным дням. Что, если вся неделя будет выходным днем, а следующая дата снова наступит на выходные?

Если это выходные, найдите следующий понедельник. Если это государственный праздник, перейдите к следующему дню. Продолжайте проверять оба, пока оба не станут действительными, тогда вы закончите.

$date = new DateTime("first day of next month");
$publicHolidays = ['01-01', '05-01']; // Format: mm-dd

while (true) {
    // format("N") >= 6 == Weekend
    if ($date->format("N") >= 6) {
        // If Saturday or Sunday, add 1 or 2 days. 
        // N=6 (Saturday), 8-6 = 2, get monday
        // N=7 (Sunday), 8-7 = 1, get monday
        $date->modify("+".(8-$date->format("N"))." days");
    } elseif (in_array($date->format("m-d"), $publicHolidays)) {
        // This day is a public holiday! Add one.
        $date->modify("+1 day");
    } else {
        break;
    }
}

echo $date->format("Y-m-d");
0 голосов
/ 30 апреля 2019

Это красиво? Будет ли это работать? Вы ставите!

function getDODate() {
    // public holidays:
    $publicHolidays = ['0101', '0501'];
    // Iterate from the 1st - 7th for dates:
    for($i=1;$i<=7;$i++) {
        // Day of the month:
        $day = "0".$i;
        // Next Actual month:
        $month = date("m",strtotime("next month"));
        // DayMonth to compare for public holidays:
        $monthDay = $month.$day;
        // Fulldate (this will be returned:
        $fullDate = date("Y").$monthDay;
        // Day Name of the fullDate about:
        $dayName = date("l", strtotime($fullDate));
        // First, let's get the date to ensure it's not a public holiday:
        if (!in_array($monthDay, $publicHolidays)) {
            // Date does not fall on a public holiday, is it a weekend?
            if (!in_array($dayName, ['Saturday', 'Sunday'])) {
                // We've got a date that will work, return:
                return $fullDate;
            }
        }
    }
}
...