2013-02-16 58 views
14

例如對於獲取日期爲節假日:如何使用PHP

  1. 馬丁·路德·金一月的第三個星期一天
  2. 月的第三個星期一爲總統日(華盛頓生日)
  3. 3月的最後一個星期天復活節
  4. 去年五月的星期一紀念日

我試圖讓這些日期,這樣我可以在我的日曆標記它無需手動把一切都放到了幾年。


MODIFIED ANSWER !!

$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

看起來這梨包你想要做什麼http://pear.php.net/package/Date_Holidays/redirected復活節 – 2013-02-16 06:16:19

回答

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 march $currentYear")); 
+1

並不總是最後一個星期一在三月。最好使用內置在easter_date()函數中的PHP:http://php.net/manual/en/function.easter-date.php – 2015-09-25 20:48:44

+0

這並不總是返回所需的日期。檢查@史蒂夫 - 伊森伯格評論 – Javis 2016-05-10 19:46:39

+0

可選,如果你只是想當年你一天可以縮短上面,像這樣: \t 陣亡將士紀念日 - 回聲日期(「M-d」的strtotime(「的最後一個星期一遊行」)); – TGates 2018-02-13 19:43:55

4

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文檔頁面對其使用有額外的評論。 小心

2

這種方式爲我工作。

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

+0

你是否忘記了復活節? – CoachNono 2016-02-14 02:39:36

0

解決方案在德國移動holydays打印出來的節日:返回「YMD」格式化數組字符串包括星期五,復活節星期一,星期五和五旬節星期一。 每天爲復活節創建一個新的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; 
}