文書更新:2018年05月28日(月) 午後5時46分07秒

Home > 備忘録 > 言語関連 > php に関すること > 手作りカレンダー( 18 )

左のようなカレンダーを作ってみました。

style sheetの部

<style type="text/css">
table.calendar {
	border-collapse:collapse;
	border-spacing:0;
	text-align:center;
	font-size:13px;
	line-height: 13px;
}
table.calendar td {
	padding:1px;
	border:1px #897858 solid;
	color:#000000;
}
table.calendar td.today {
	background:#ffff22;
	color:#000000;
}
table.calendar td.today_red {
	background:#ffff22;
	color:red;
}
table.calendar td.today_blue {
	background:#ffff22;
	color:blue;
}
table.calendar .red {
	color:red;
}
table.calendar .blue {
	color:blue;
}
</style>

phpの部

function calendar($year = "", $month = "") {
	if(empty($year) && empty($month)) {
		$year = date("Y");
		$month = date("n");
	}
	$end_day = date("t", mktime(0, 0, 0, $month,1, $year));
	$ret=<<<EOD
<table class="calendar" cellspacing="0" cellpadding="0" border="0"><caption>{$year}年{$month}月</caption>
	<tbody>
		<tr style="background:#eee;"><td class="red">日</td><td>月</td><td>火</td><td>水</td><td>木</td><td>金</td><td class="blue">土</td></tr>\n
EOD;
	$week = date("w", mktime(0, 0, 0, $month, 1, $year));
	if($week>0){
		$ret.="\t\t<tr>".str_repeat("<td></td>", $week);
	}
	for($i=1;$i<$end_day+1;$i++){
		$week = date("w", mktime(0, 0, 0, $month, $i, $year));
		list($bool,$name)=is_holiday($year,$month,$i);
		if($week==6){/*土曜日*/
			if ($i == date("j") && $year == date("Y") && $month == date("n")){
				if($bool){
					$ret.="<td class=today_red>{$i}</td></tr>\n";
				}else{
					$ret.="<td class=today_blue>{$i}</td></tr>\n";
				}
			}else{
				if($bool){
					$ret.="<td class=red>{$i}</td></tr>\n";
				}else{
					$ret.="<td class=blue>{$i}</td></tr>\n";
				}
			}
		}else if($week==0){/*日曜日*/
			if ($i == date("j") && $year == date("Y") && $month == date("n")){
				$ret.="\t\t<tr><td class=today_red>{$i}</td>";
			}else{
				$ret.="\t\t<tr><td class=red>{$i}</td>";
			}
		}else{/*平日*/
			if ($i == date("j") && $year == date("Y") && $month == date("n")){
				if($bool){
					$ret.="<td class=today_red>{$i}</td>";
				}else{
					$ret.="<td class=today>{$i}</td>";
				}
			}else{
				if($bool){
					$ret.="<td class=red>{$i}</td>";
				}else{
					$ret.="<td>{$i}</td>";
				}
			}
		}
	}
	$week = date("w", mktime(0, 0, 0, $month, $end_day, $year));
	$ret.=str_repeat("<td></td>", 6-$week);
	if(6-$week!=0)	$ret.="</tr>\n";
$ret.=<<<EOD2
	</tbody>
</table>
EOD2;
return $ret;
}
function is_holiday($year,$month,$day){
	$holiday=array(
		array(101,1949,9999,"元日"),
		array(115,1949,1999,"成人の日"),
		array(211,1967,9999,"建国記念の日"),
		array(429,1949,1988,"天皇誕生日"),
		array(429,1989,2006,"みどりの日"),
		array(429,2007,9999,"昭和の日"),
		array(503,1949,9999,"憲法記念日"),
		array(504,2007,9999,"みどりの日"),
		array(505,1949,9999,"こどもの日"),
		array(720,1996,2002,"海の日"),
		array(915,1996,2002,"敬老の日"),
		array(1010,1996,1999,"体育の日"),
		array(1103,1949,9999,"文化の日"),
		array(1123,1949,9999,"勤労感謝の日"),
		array(1223,1989,9999,"天皇誕生日")
		);
	if($year>=2000)	$holiday[]=_holiday2($year,1,2);/*成人の日(1月の第2月曜日)*/
	if($year>=2003)	$holiday[]=_holiday2($year,7,3);/*海の日(7月の第3月曜日)*/
	if($year>=2003)	$holiday[]=_holiday2($year,9,3);/*敬老の日(9月の第3月曜日)*/
	if($year>=2000)	$holiday[]=_holiday2($year,10,2);/*体育の日(10月の第2月曜日)*/
	$holiday[]=_holiday3($year,3);/*春分の日*/
	$holiday[]=_holiday3($year,9);/*秋分の日*/
	for($i=0;$i<count($holiday);$i++){
		if($holiday[$i][1]<=$year&&$year<=$holiday[$i][2]){
			if($month*100+$day==$holiday[$i][0])	return array(true,$holiday[$i][3]);
			if($year>=1973){
				$week = date("w", mktime(0, 0, 0, $month, $day-1, $year));
				if($week==0&&$month*100+$day-1==$holiday[$i][0])	return array(true,"振替休日");/*振替休日*/
			}
		}
	}
	if(1988<=$year&&$year<=2006){
		if($month*100+$day==504){/*国民の休日*/
			$week = date("w", mktime(0, 0, 0, 5, 3, $year));
			if($week==0||$week==5||$week==6)	return array(true,"国民の休日");
		}
	}else if(2007<=$year){
		if($month*100+$day==506){/*国民の休日*/
			$week = date("w", mktime(0, 0, 0, 5, 3, $year));
			if($week==0||$week==5||$week==6)	return array(true,"国民の休日");
		}
	}
	if($year>=2003){
		$keirou=_holiday2($year,9,3);
		$syubun=_holiday3($year,9);
		if(($keirou[0]+1==$month*100+$day)&&($month*100+$day==$syubun[0]-1))	return array(true,"国民の休日");
	}
	return array(false,"");
}
function _holiday2($year,$month,$count){/*第$count回目の月曜日*/
	$cc=0;
	for($i=1;$i<=$count*7;$i++){
		if(date("w", mktime(0, 0, 0, $month, $i, $year))==1){
			$cc++;
			if($cc==$count){
				if($month==1)	return array($month*100+$i,2000,9999,"成人の日");
				if($month==7)	return array($month*100+$i,2003,9999,"海の日");
				if($month==9)	return array($month*100+$i,2003,9999,"敬老の日");
				if($month==10)return array($month*100+$i,2000,9999,"体育の日");
			}
		}
	}
	return 0;
}
function _holiday3($year,$month){/*春分・秋分の日*/
	if(1851<=$year&&$year<=1899){
		if($month==3){
			return array($month*100+(int)(19.8277+0.242194*($year-1980)-(int)(($year-1983)/4)),0,9999,"春分の日");
		}else if($month==9){
			return array($month*100+(int)(22.2588+0.242194*($year-1980)-(int)(($year-1983)/4)),0,9999,"秋分の日");
		}
	}else if($year<=1979){
		if($month==3){
			return array($month*100+(int)(20.8357+0.242194*($year-1980)-(int)(($year-1983)/4)),0,9999,"春分の日");
		}else if($month==9){
			return array($month*100+(int)(23.2588+0.242194*($year-1980)-(int)(($year-1983)/4)),0,9999,"秋分の日");
		}
	}else if($year<=2099){
		if($month==3){
			return array($month*100+(int)(20.8431+0.242194*($year-1980)-(int)(($year-1980)/4)),0,9999,"春分の日");
		}else if($month==9){
			return array($month*100+(int)(23.2488+0.242194*($year-1980)-(int)(($year-1980)/4)),0,9999,"秋分の日");
		}
	}else if($year<=2150){
		if($month==3){
			return array($month*100+(int)(21.8510+0.242194*($year-1980)-(int)(($year-1980)/4)),0,9999,"春分の日");
		}else if($month==9){
			return array($month*100+(int)(24.2488+0.242194*($year-1980)-(int)(($year-1980)/4)),0,9999,"秋分の日");
		}
	}
	return 0;
}

HTMLの部

※表示したいところで
<?php
echo calendar();	←例:今月のカレンダー
echo calendar(2012,8);	←例:2012年8月のカレンダー
?>
----------------ASP形式のタグが使える場合( sp_tags=on )----------------
<%=calendar()%>		←例:今月のカレンダー
<%=calendar(2012,8)%>	←例:2012年8月のカレンダー

ASP形式のタグが使えるようにする

[root@server]# vi /etc/php.ini
; Allow ASP-style <% %> tags.
; http://www.php.net/manual/en/ini.core.php#ini.asp-tags
asp_tags = on		←onに変更

[root@server]# systemctl restart httpd	←httpdの再起動