Например:
Я пытаюсь получить эти даты, чтобы я мог пометить это в своем календаре, не закладывая вручную все эти годы.
МОДИФИЦИРОВАННЫЙ ОТВЕТ !!
$curYir = date("Y");//current year $MLK = date('Ym-d', strtotime("january $curYir third monday")); //marthin luthor king day $PD = date('Ym-d', strtotime("february $curYir third monday")); //presidents day $Est = date('Ym-d', easter_date($curYir))); // easter $MDay = date('Ym-d', strtotime("may $curYir first monday")); // memorial day //("may $curYir last monday") will give you the last monday of may 1967 //much better to determine it by a loop $eMDay = explode("-",$MDay); $year = $eMDay[0]; $month = $eMDay[1]; $day = $eMDay[2]; while($day <= 31){ $day = $day + 7; } if($day > 31) $day = $day - 7; $MDay = $year.'-'.$month.'-'.$day; $LD = date('Ym-d', strtotime("september $curYir first monday")); //labor day $CD = date('Ym-d', strtotime("october $curYir third monday")); //columbus day $TH = date('Ym-d', strtotime("november $curYir first thursday")); // thanks giving //("november $curYir last thursday") will give you the last thursday of november 1967 //much better to determine it by a loop $eTH = explode("-",$TH); $year = $eTH[0]; $month = $eTH[1]; $day = $eTH[2]; while($day <= 30){ $day = $day + 7; } if($day > 30) //watch out for the days in the month November only have 30 $day = $day - 7; $TH = $year.'-'.$month.'-'.$day;
Вы можете использовать эту функцию php. StrToTime
$currentYear = date("Y");
День MLK –
echo date('Ym-d', strtotime("third monday of january $currentYear"));
День президентов –
echo date('Ym-d', strtotime("third monday/OD February $currentYear"));
Пасха –
echo date('Ym-d', strtotime("last sunday of march $currentYear"));
День памяти –
echo date('Ym-d', strtotime("last monday of march $currentYear"));
Функция strtotime полезна здесь, но, похоже, есть некоторые особенности того, как она интерпретирует английскую формулировку. Обязательно тщательно проверьте свою формулировку и проверьте свои результаты.
Например, похоже, что он должен работать, но он вернется в последний понедельник апреля ($ currentYear = 2014)!
echo "Memorial Day " . date('F d, Y', strtotime("may $currentYear last monday")) . "<br />";
Однако эта фраза вернет правильный праздник на 2014 год.
echo "Memorial Day " . date('F d, Y', strtotime("last monday of May $currentYear")) . "<br />";
И это даст вам правильную дату праздника в следующем году.
echo "Memorial Day " . date('F d, Y', strtotime("last monday of May $currentYear+1")) . "<br />";
На странице PHP doc есть дополнительные комментарии к ее использованию. Береги себя
Этот способ работал для меня.
function observed_date($holiday){ $day = date("w", strtotime($holiday)); if($day == 6) { $observed_date = $holiday -1; } elseif ($day == 0) { $observed_date = $holiday +1; } else { $observed_date = $holiday; } return $observed_date; } function get_holiday($holiday_name) { $currentYear = date('Y'); switch ($holiday_name) { // New Years Day case "new_year": $holiday = observed_date(date('Ymd', strtotime("first day of january $currentYear"))); break; // Martin Luther King, Jr. Day case "mlk_day": $holiday = date('Ymd', strtotime("january $currentYear third monday")); break; // President's Day case "presidents_day": $holiday = date('Ymd', strtotime("february $currentYear third monday")); break; // Memorial Day case "memorial_day": $holiday = (new DateTime("Last monday of May"))->format("Ymd"); break; // Independence Day case "independence_day": $holiday = observed_date(date('Ymd', strtotime("july 4 $currentYear"))); break; // Labor Day case "labor_day": $holiday = date('Ymd', strtotime("september $currentYear first monday")); break; // Columbus Day case "columbus_day": $holiday = date('Ymd', strtotime("october $currentYear second monday")); break; // Veteran's Day case "veterans_day": $holiday = observed_date(date('Ymd', strtotime("november 11 $currentYear"))); break; // Thanksgiving Day case "thanksgiving_day": $holiday = date('Ymd', strtotime("november $currentYear fourth thursday")); break; // Christmas Day case "christmas_day": $holiday = observed_date(date('Ymd', strtotime("december 25 $currentYear"))); break; default: $holiday = ""; break; } return $holiday; }
Затем вы можете распечатать праздник, вызвав функцию echo get_holiday('new_year');
И результат на 2015 год должен быть 20150101
Решение для перемещения праздников в Германии: возвращает массив формованных строк «Ymd», включая хорошую пятницу, пасху, вознесение и пятнадцатый понедельник. Новый объект DateTime для easter ist создан для каждого дня для повышения удобочитаемости.
function beweglicheFeiertage( int $year ):array { //Karfreitag - good friday $return = array(); $easterDate = DateTime::createFromFormat('U', easter_date($year) ); $easterDate->modify('- 1 days'); $return[] = $easterDate->format('Ym-d'); //Ostermontag easter monday $easterDate = DateTime::createFromFormat('U', easter_date($year) ); $easterDate->modify('+ 2 day'); $return[] = $easterDate->format('Ym-d'); //Himmelfahrt ascencion $easterDate = DateTime::createFromFormat('U', easter_date($year) ); $easterDate->modify('+ 40 days');//go to Ascencionday $return[] = $easterDate->format('Ym-d'); //Pfingstmontag - pentecost monday $easterDate = DateTime::createFromFormat('U', easter_date($year) ); $easterDate->modify('+ 51 days');//go to Pentecost Monday $return[] = $easterDate->format('Ym-d'); return $return; }