勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPで土日祝日及び営業時間を考慮した上で翌○営業日を計算する方法

   2021/04/26  PHP

PHPで翌○営業日を計算したい。例えば本日が2021/04/15で翌5営業日を計算した場合、4/22を出力したい。また、例えば通販サイト等で「14時までに購入いただいた方は本日発送」みたいな案内がある。この営業時間の概念も入れたい。以下に対応方法をメモ。

 

やりたいこと

翌○営業日を計算したい。土日祝は+1日とする。また、14時を過ぎている場合はさらに+1日とする。

 

休日をどうするか

PHPで土日はdate関数を使用することで取得できるが、祝日は取得できない。また、祝日は「○月の第一月曜日」等、年度によって日付が変わる。さらには法改正で「○月の第一月曜日」自体も変わるかもしれない。

その為、以前にGASで作成した祝日APIか、他所様のAPIを使用する。今回は他所様のAPIで対応した。

 

ソース

<?php
//○営業日指定
$limit_day = 5;

//営業時間指定
$limit_hour = 14;

//固定休業日。この場合は土日
$week_end = array('Sat','Sun');

//祝日APIにリクエスト
$public_holiday_api = file_get_contents('https://holidays-jp.github.io/api/v1/date.json');
$tmp_public_holiday = json_decode($public_holiday_api, true);

//年月日のみ配列に格納
foreach( $tmp_public_holiday as $key => $val ){
	$public_holiday['data'][] = $key;
}

//現在日付から1日単位で休日かを判定する
$business_day = date('Y-m-d');
$tmp_business_day = date('Y-m-d');

$limit_hour_flg = true;
$count = 1;
while( $count <= $limit_day ){
	$tmp = strtotime($tmp_business_day . ' +' . $count . 'day');

	//土日祝日の場合
	if( in_array(date('D', $tmp), $week_end) || in_array(date('Y-m-d', $tmp), $public_holiday['data']) ){
		$count++;
		$limit_day++;

	//営業時間を過ぎている場合
	}else if( $limit_hour <= date('H') && $limit_hour_flg ){
		$count++;
		$limit_day++;

		$limit_hour_flg = false;

	}else{
		$count++;
	}

	$business_day = date('Y-m-d', strtotime($business_day . ' +1 day')); 
}

var_dump(date('m月d日', strtotime($business_day)));

 

注意点

本ソースコードは祝日APIを毎回リクエストするような形だが、それだと相手側に迷惑がかかる。その為、実際に運用する際はAPIリクエスト後にデータベースやJSONファイルにデータを格納する形が望ましいかと思われる。

 

参考サイト

http://ziyuudesu.seesaa.net/article/415893897.html

 - PHP

  関連記事

CodeIgniter4&Bootstrap&jQueryで簡易版お問い合わせページの作成

CodeIgniter4.4.4&Bootstrap&jQuer ...

PHPで画像を上下反転させ保存する

やりたかった事は、下記の通り。 ・既にフォルダに保存されている画像を上下反転させ ...

PHPのセッションでログイン、ログアウトの管理。あとセッションが保存されない場合の対処。

セッションはほとんど使ったことがなく、 色々つまづいたのでメモ。 やりたかった事 ...

カンマ区切りの文字列で最後のカンマを排除

文字列をカンマ区切りにして、カンマを取り外して 配列にする際、頭もしくはお尻につ ...

MySQLiでFOUND_ROWS(全件数取得)

MySQLiでFOUND_ROWS(全件数取得)。 $sql = ' SELEC ...