как назначить дату на праздники с помощью php

Например:

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

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


ИЗМЕНЕННЫЙ ОТВЕТ !!

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

person telexper    schedule 16.02.2013    source источник
comment
Похоже, этот пакет с грушей делает то, что вы хотите pear.php.net/package/Date_Holidays/redirected   -  person    schedule 16.02.2013


Ответы (6)


Вы можете использовать эту функцию php. strtotime

$currentYear = date("Y");

День MLK -

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"));
person Sanchit    schedule 16.02.2013
comment
Пасха - не всегда последний понедельник марта. Лучше использовать встроенную в PHP функцию easter_date (): php.net/manual/en /function.easter-date.php - person Matt James; 25.09.2015
comment
Это не всегда возвращает желаемую дату. Проверить @ комментарий Стива-Изенберга - person Javis; 10.05.2016
comment
При желании, если вам просто нужен день текущего года, вы можете сократить указанное выше следующим образом: Memorial Day - echo date ('m-d', strtotime (последний понедельник марта)); - person TGates; 13.02.2018
comment
День памяти = последний понедельник мая. - person luenib; 28.09.2018

Здесь полезна функция 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 есть дополнительные комментарии по его использованию. Заботиться

person Steve Isenberg    schedule 25.01.2014

Этот способ сработал для меня.

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

person Amen Ra    schedule 05.11.2015
comment
Вы забываете пасху? - person Etienne Noël; 14.02.2016
comment
Добавление и вычитание 1 из дат в формате ГГГГММДД - плохая идея: если дата приходится на первый день месяца, откат на 1 день даст вам недопустимую дату. Например, 1/1/2011 (почти годовой день) - это суббота, и вычитая 1 из 20110101, вы получите 20110100. То же самое, если праздник выпадает на последний день месяца, который бывает воскресеньем: если вы добавите 1 день , вы получите неверную дату. - person kmoser; 13.09.2020

Решение для переноса праздников в Германии: возвращает массив строк в формате «Y-m-d», включая страстную пятницу, пасхальный понедельник, ascencion и пятидесятнический понедельник. Новый объект DateTime для пасхи создается для каждого дня, чтобы улучшить читаемость.

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;
}
person Max    schedule 03.11.2017
comment
Добавление и вычитание 1 из дат в формате ГГГГММДД - плохая идея: если дата приходится на первый день месяца, откат на 1 день даст вам недопустимую дату. Например, 1/1/2011 (почти годовой день) - это суббота, и вычитая 1 из 20110101, вы получите 20110100. То же самое, если праздник выпадает на последний день месяца, который бывает воскресеньем: если вы добавите 1 день , вы получите неверную дату. - person kmoser; 11.09.2020
comment
Это может быть верно для функций date (). Однако в методе modify () объекта Datetime об этом позаботятся. - person Max; 13.09.2020
comment
Моя ошибка, мой комментарий был предназначен для поста @Amen Ra над вами. - person kmoser; 13.09.2020

Я создал функцию, которая вычисляет все федеральные праздники (США) для любого заданного года и возвращает их в массиве. Я тестировал его на нескольких разных годах (с 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 = $this->getObservedDate( date('m/d/Y', strtotime("1/1/$year")) ); //new years day

        $MLK = $this->getObservedDate( date('m/d/Y', strtotime("third monday of january $year")) );  //martin luther king day

        $PD = $this->getObservedDate( date('m/d/Y', strtotime("third monday of february $year")) ); ; //presidents day

        $MDay = $this->getObservedDate( date('m/d/Y', strtotime("last monday of May $year")) ); //memorial day  

        $IDay = $this->getObservedDate( date('m/d/Y', strtotime("7/4/$year")) );  // independence day

        $LD = $this->getObservedDate( date('m/d/Y', strtotime("first monday of september $year")) ); //labor day

        $VD = $this->getObservedDate( date('m/d/Y', strtotime("11/11/$year")) ); //veterans day

        $ColD =$this->getObservedDate( date('m/d/Y', strtotime("second monday of october $year")) ); //columbus day   

        $TG = $this->getObservedDate( date('m/d/Y', strtotime("last thursday of november $year")) ); // thanksgiving       

        $CD = $this->getObservedDate( date('m/d/Y', strtotime("12/25/$year")) );  //christmas day 

        $nonWorkingDays = array();

        array_push($nonWorkingDays, $NY, $MLK, $PD, $MDay, $IDay, $LD, $ColD, $VD, $TG, $CD);

        return $nonWorkingDays;
    }
person Ivan Narvaez    schedule 09.10.2019

Если вы хотите вручную ввести даты здесь раз и навсегда, вы можете использовать здесь мою индивидуальную функцию. Он короткий, простой и удовлетворяет потребности каждого. Вы можете доработать его под себя, если хотите. Кроме того, если вы можете найти способ динамически передавать даты в массиве в заданном формате, вы можете изменить его таким образом. Однако моя функция ниже подходит только для тех праздников, у которых есть СТАТИЧЕСКИЕ даты. Возможно, вам придется вручную управлять праздниками каждый год, для которых есть ДИНАМИЧЕСКИЕ или РАЗЛИЧНЫЕ дни, такие как день памяти, день труда и т. Д.

Моя пользовательская функция PHP

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

function checkHoliday($date){
  if(date('l', strtotime($date)) == 'Saturday'){
    return "Saturday";
  }else if(date('l', strtotime($date)) == 'Sunday'){
    return "Sunday";
  }else{
    $receivedDate = date('d M', strtotime($date));

    $holiday = array(
      '01 Jan' => 'New Year Day',
      '18 Jan' => 'Martin Luther King Day',
      '22 Feb' => 'Washington\'s Birthday',
      '05 Jul' => 'Independence Day',
      '11 Nov' => 'Veterans Day',
      '24 Dec' => 'Christmas Eve',
      '25 Dec' => 'Christmas Day',
      '31 Dec' => 'New Year Eve'
    );

    foreach($holiday as $key => $value){
      if($receivedDate == $key){
        return $value;
      }
    }
  }
}

И назови это так

$date = '01/01/2021';

echo checkHoliday($date);
person Shubham Jha    schedule 05.02.2021