как получить дату для праздников, используя php

Например:

  1. 3-й понедельник января для Мартина Лютера Кинга
  2. 3-й понедельник февраля для Дня президентов (День рождения Вашингтона)
  3. Последнее воскресенье марта на Пасху
  4. В последний понедельник мая в День памяти

Я пытаюсь получить эти даты, чтобы я мог пометить это в своем календаре, не закладывая вручную все эти годы.


МОДИФИЦИРОВАННЫЙ ОТВЕТ !!

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