Как получить дату для праздников, используя php
Например:
- 3-й понедельник января для Мартина Лютера Кинга
- Третий понедельник февраля для Дня президентов (День рождения Вашингтона)
- Последнее воскресенье марта для Пасхи
- Последний понедельник мая День памяти
Я пытаюсь получить эти даты, чтобы я мог пометить это в своем календаре без необходимости вручную ставить все на долгие годы.
МОДИФИЦИРОВАННЫЙ ОТВЕТ!!
$curYir = date("Y");//current year
$MLK = date('Y-m-d', strtotime("january $curYir third monday")); //marthin luthor king day
$PD = date('Y-m-d', strtotime("february $curYir third monday")); //presidents day
$Est = date('Y-m-d', easter_date($curYir))); // easter
$MDay = date('Y-m-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('Y-m-d', strtotime("september $curYir first monday")); //labor day
$CD = date('Y-m-d', strtotime("october $curYir third monday")); //columbus day
$TH = date('Y-m-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;
Ответы
Ответ 1
Вы можете использовать эту функцию PHP. StrToTime
$currentYear = date("Y");
День МЛК -
echo date('Y-m-d', strtotime("third monday of january $currentYear"));
День президентов -
echo date('Y-m-d', strtotime("third monday/OD February $currentYear"));
Пасха -
echo date('Y-m-d', strtotime("last sunday of march $currentYear"));
День памяти -
echo date('Y-m-d', strtotime("last monday of may $currentYear"));
Ответ 2
Функция 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 есть дополнительные комментарии к его использованию.
Будьте осторожны
Ответ 3
Этот способ работал у меня.
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 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 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
Ответ 4
Решение для перемещения праздничных дней в Германии: возвращает массив формованных строк "Y-m-d", включая хорошую пятницу, пасху в понедельник, взлет и пятнадцатый понедельник.
Новый объект 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('Y-m-d');
//Ostermontag easter monday
$easterDate = DateTime::createFromFormat('U', easter_date($year) );
$easterDate->modify('+ 2 day');
$return[] = $easterDate->format('Y-m-d');
//Himmelfahrt ascencion
$easterDate = DateTime::createFromFormat('U', easter_date($year) );
$easterDate->modify('+ 40 days');//go to Ascencionday
$return[] = $easterDate->format('Y-m-d');
//Pfingstmontag - pentecost monday
$easterDate = DateTime::createFromFormat('U', easter_date($year) );
$easterDate->modify('+ 51 days');//go to Pentecost Monday
$return[] = $easterDate->format('Y-m-d');
return $return;
}
Ответ 5
Я создал функцию, которая вычисляет все федеральные праздники (США) для каждого года и возвращает их в массиве. Я тестировал его несколько лет (с 2016 по 2024 год). Вот код, пожалуйста, дайте мне знать, если вы обнаружите какие-либо просчеты:
//function that checks if a holiday lands on saturday/sunday and so we can move them to a friday/monday respectively
private function getObservedDate($holidayDate){
$dayofweek = date("w", strtotime($holidayDate));
if ($dayofweek == 6) $holidayDate = date('m/d/Y', strtotime("$holidayDate - 1 days")); //saturday moves to friday
else if ($dayofweek == 0) $holidayDate = date('m/d/Y', strtotime("$holidayDate + 1 days")); //sunday moves monday
return $holidayDate;
}
//function that calculates the holidays for any given year
private function getFederalHolidaysForYear($year){
$NY = new stdClass(); //new years day
$NY->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("1/1/$year")) );
$NY->description = "New Years Day";
$MLK = new stdClass(); //martin luther king day
$MLK->holidayDate = $this->getObservedDate( date('m/d/Y', strtotime("third monday of january $year")) );
$MLK->description = "Martin Luther King Jr. Day";
$PD = new stdClass(); //presidents day
$PD->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("third monday of february $year")) );
$PD->description = "Presidents Day (Washingtons Birthday)";
$MDay = new stdClass(); //memorial day
$MDay->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("last monday of May $year")) );
$MDay->description = "Memorial Day";
$IDay = new stdClass(); // independence day
$IDay->holidayDate = $this->getObservedDate( date('m/d/Y', strtotime("7/4/$year")) );
$IDay->description = "Independence Day";
$LD = new stdClass(); //labor day
$LD->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("first monday of september $year")) );
$LD->description = "Labor Day";
$VD = new stdClass(); //veterans day
$VD->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("11/11/$year")) );
$VD->description = "Veterans Day";
$ColD = new stdClass(); //columbus day
$ColD->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("second monday of october $year")) );
$ColD->description = "Columbus Day";
$TG = new stdClass(); // thanksgiving
$TG->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("last thursday of november $year")) );
$TG->description = "Thanksgiving Day";
$CD = new stdClass(); //christmas day
$CD->holidayDate= $this->getObservedDate( date('m/d/Y', strtotime("12/25/$year")) );
$CD->description = "Christmas Day";
$nonWorkingDays = array();
array_push($nonWorkingDays, $NY, $MLK, $PD, $MDay, $IDay, $LD, $ColD, $VD, $TG, $CD);
return $nonWorkingDays;
}