PHPで祝日と休日を判定する関数

以前、「JavaScriptで休日を判定する関数」を紹介しましたが、今回はそのPHP版です。

次の4個の関数を使います。
getHoliday 休日を返す。
getNationalHoliday 祝日を返す。
shunbun 春分を返す。
shubun 秋分を返す。

function getHoliday($ts) {
  //休日(祝日と日曜日と振替休日)を判定する関数。
  //休日ならばその名称、休日でなければ空文字を返す。
  $kyujitsu = "休日";
  $isNH =array();
  $isSun =array();
  $holidayname =array();
  if(date("Y",$ts) < 2007) {
    return "Error";
  }
  for($i = -3; $i < 2; $i++) {
    $thisday = mktime(0,0,0,date("n",$ts),date("j",$ts) + $i,date("Y",$ts));
    $holidayname[$i] = getNationalHoliday($thisday);
    $isNH[$i] = ($holidayname[$i] != "");
    $isSun[$i] = date("w",$thisday) == 0 ? true : false;
  }
  //国民の祝日に関する法律第三条
  //第1項 「国民の祝日」は、休日とする。
  if($isNH[0]) {
    return $holidayname[0];
  }
  //第2項 「国民の祝日」が日曜日に当たるときは、
  //その日後においてその日に最も近い「国民の祝日」でない日を
  //休日とする。
  if($isSun[-1] & $isNH[-1]) {
    return $kyujitsu;
  }
  if($isSun[-2] & $isNH[-2] & $isNH[-1]) {
    return $kyujitsu;
  }
  if($isSun[-3] & $isNH[-3] & $isNH[-2] & $isNH[-1]) {
    return $kyujitsu;
  }
  //第3項 その前日及び翌日が「国民の祝日」である日は、休日とする。
  if($isNH[-1] & $isNH[1]) {
    return $kyujitsu;
  }
  //日曜日
  if($isSun[0]) {
    return "日曜日";
  }
  return "";
}

function getNationalHoliday($ts) {
  //祝日を判定する関数。
  //祝日ならばその名称、祝日でなければ空文字を返す。
  //20140824 作成。
  //20190224 修正。2019年対応(天皇の即位の日等)を反映。
  //20190224 修正。2020年対応(スポーツの日等)を反映。
  //20201229 修正。2021年対応(海の日、スポーツの日、山の日)を反映。
  if(date("Y",$ts) < 2007) {
    return "Error";
  }
  $nen = date("Y",$ts);
  $tsuki = date("n",$ts);
  $hi = date("j",$ts);
  $yobi = date("w",$ts);

  //2019年限定
  if($nen == 2019 & $tsuki == 5 & $hi == 1){
    return "天皇の即位の日";
  }else if($nen == 2019 & $tsuki == 10 & $hi == 22){
    return "即位礼正殿の儀の行われる日";

  //2020年限定
  }else if($nen == 2020 & $tsuki == 7 & $hi == 23){
    return "海の日";
  }else if($nen == 2020 & $tsuki == 7 & $hi == 24){
    return "スポーツの日";
  }else if($nen == 2020 & $tsuki == 8 & $hi == 10){
    return "山の日";

  //2021年限定
  }else if($nen == 2021 & $tsuki == 7 & $hi == 22){
    return "海の日";
  }else if($nen == 2021 & $tsuki == 7 & $hi == 23){
    return "スポーツの日";
  }else if($nen == 2021 & $tsuki == 8 & $hi == 8){
    return "山の日";
  }

  //一般
  if($tsuki == 1 & $hi == 1) {
    return "元日";
  }
  if($tsuki == 2 & $hi == 11) {
    return "建国記念の日";
  }
  if($tsuki == 4 & $hi == 29) {
    return "昭和の日";
  }
  if($tsuki == 5 & $hi == 3) {
    return "憲法記念日";
  }
  if($tsuki == 5 & $hi == 4) {
    return "みどりの日";
  }
  if($tsuki == 5 & $hi == 5) {
    return "こどもの日";
  }
  if($nen >= 2016 & $nen != 2020 & $nen !=2021 & $tsuki == 8 & $hi == 11) {
    return "山の日"; //2016-8-11から実施。
  }
  if($tsuki == 11 & $hi == 3) {
    return "文化の日";
  }
  if($tsuki == 11 & $hi == 23) {
    return "勤労感謝の日";
  }
  if($nen<=2018 & $tsuki == 12 & $hi == 23) {
    return "天皇誕生日";
  }
  if($nen>=2020 & $tsuki == 2 & $hi == 23) {
    return "天皇誕生日";
  }
  if($tsuki == 1 & $yobi == 1 & 7 < $hi & $hi < 15) {
    return "成人の日"; //1月第2月曜日;
  }
  if($nen != 2020 & $nen != 2021 & $tsuki == 7 & $yobi == 1 & 14 < $hi & $hi < 22) {
    return "海の日"; //7月第3月曜日
  }
  if($tsuki == 9 & $yobi == 1 & 14 < $hi & $hi < 22) {
    return "敬老の日"; //9月第3月曜日
  }
  if($nen <= 2019 & $tsuki == 10 & $yobi == 1 & 7 < $hi & $hi < 15) {
    return "体育の日"; //10月第2月曜日
  }
  if($nen >= 2022 & $tsuki == 10 & $yobi == 1 & 7 < $hi & $hi < 15) {
    return "スポーツの日"; //10月第2月曜日
  }
  if($tsuki == 3 & $hi == shunbun($nen)) {
    return "春分の日";
  }
  if($tsuki == 9 & $hi == shubun($nen)) {
    return "秋分の日";
  }
  return "";
}

function shunbun($nen) {//春分の日
  if($nen < 1900 || $nen > 2099) {
    return 0;
  }
  if($nen % 4 === 0) {
    return $nen <= 1956 ? 21 : ($nen <= 2088 ? 20 : 19);
  } else if($nen % 4 == 1) {
    return $nen <= 1989 ? 21 : 20;
  } else if($nen % 4 == 2) {
    return $nen <= 2022 ? 21 : 20;
  } else {
    return $nen <= 1923 ? 22 : ($nen <= 2055 ? 21 : 20);
  }
}

function shubun($nen) {//秋分の日
  if($nen < 1900 || $nen > 2099) {
    return 0;
  }
  if($nen % 4 === 0) {
    return $nen <= 2008 ? 23 : 22;
  } else if($nen % 4 == 1) {
    return $nen <= 1917 ? 24 : ($nen <= 2041 ? 23 : 22);
  } else if($nen % 4 == 2) {
    return $nen <= 1946 ? 24 : ($nen <= 2074 ? 23 : 22);
  } else {
    return $nen <= 1979 ? 24 : 23;
  }
}

使用例は次のとおりです。

$ts = mktime(0, 0, 0, 7, 22, 2021);
$h = getHoliday($ts);
print $h;

コメント

タイトルとURLをコピーしました