勉強したことのメモ

webプログラマが勉強したことのメモ。

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

      2021/04/26

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

  関連記事

PHPからPOST送信する方法

PHPから他サーバのAPIに対してPOSTでリクエストしたかった。GETだったら ...

PHPで改行を含むデータをCSV化

PHPで改行を含むデータをCSV化した場合、そのCSVファイルをエクセル等で開く ...

コマンドの実行履歴を確認する

SSH接続した際のコマンド実行履歴を確認したかった。 history で確認でき ...

PHPでCSVを出力する際にメモリを節約

MySQLよりデータを大量に取り出してCSV化し、ダウンロードさせるというPHP ...

composerでmonologとTwigをインストール

「composerで○○をインストール」というのをよく見かけるがcomposer ...

MySQLで使用するインデックスを指定する

ちゃんと指定してるのにインデックスが使用されていない場合、 オプティマイザに知ら ...

MySQLiでDELETE文

MySQLiでDELETE文 ■ソース $mysqli = new mysqli ...

WordPressで任意のクエリをページに出力するプラグイン

先日、「WordPressで任意のクエリをページ内で出力する方法 」という記事で ...

PHPでis_fileとfile_existsについて

ファイルの存在チェックを行う際に、file_exists関数を 使用していたが、 ...

PHPで日時比較時の注意

PHPで日時を比較する際にミスがあったのでメモ。 基本形は下記。 $limit_ ...