Home > 備忘録 > 言語関連 > php に関すること > 手作りカレンダー( 18 )
左のようなカレンダーを作ってみました。
<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>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;
}※表示したいところで
<?php
echo calendar(); ←例:今月のカレンダー
echo calendar(2012,8); ←例:2012年8月のカレンダー
?>
----------------ASP形式のタグが使える場合( sp_tags=on )----------------
<%=calendar()%> ←例:今月のカレンダー
<%=calendar(2012,8)%> ←例:2012年8月のカレンダー[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の再起動