2008/5/13 久米
自作関数calendar(PHP入門書のカレンダー関数を改良したもの)を利用してカレンダーを表示させます。
カレンダーを表示させる例
<?php require_once("calendar.php"); $year = date("Y"); $month = date("n"); $cal=calendar($year, $month); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta httpequiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>カレンダー</title> </head> <body> <?php print $cal; ?> </body> </html> |
下記ファイルを同じフォルダにcalendar.phpとして保存
<?php function calendar($year, $month){ /*使い方の例 $year = date("Y");//現在の「年月」を取得 $month = date("n"); if(isset($_GET['year'])) $year=$_GET['year'];//もしGETで値が飛んできたらそれを入れる if(isset($_GET['month'])) $month=$_GET['month']; $cal=calendar($year, $month); */ //あらかじめ祝日の配列を設定 $holiday=set_holiday($year, $month); $WH=""; //$WH=" width='100' height='100'";//セルの幅と高さ $today = date("Y/n/j");// 今日を取得する。例 2005/7/1 //1日(月初)のタイムスタンプから「曜日」を取得 $first_day = mktime( 0, 0, 0, $month, 1, $year ); $first_weekday = date( "w", $first_day ); $cal=""; $cal.="<b>".$year."年".$month."月</b>"; $cal.= "<table border='1' cellspacing='0' cellpadding='2'> <tr> <th><font color=red>日</font></th> <th><font color=black>月</font></th> <th><font color=black>火</font></th> <th><font color=black>水</font></th> <th><font color=black>木</font></th> <th><font color=black>金</font></th> <th><font color=blue>土</font></th> </tr>"; $cal.="<tr valign='top'>"; // 最初の<tr> $weekday = 0; //曜日のカウンタ //1日の曜日まで空欄必要 while( $weekday != $first_weekday ){ $cal.="<td".$WH."> </td>"; $weekday++; } for( $day = 1; checkdate( $month, $day, $year ); $day++ ){ //土曜まで書いたなら日曜に戻して //行を変える if( $weekday > 6 ){ $weekday = 0; $cal.="</tr>\n<tr valign='top'>"; } //枠の色を決める switch( $weekday ){ case 0 : //日曜 $color = "#FFCCFF"; break; case 6 : //土曜 $color = "#C4E1FF"; break; default : //月曜〜金曜 $color = "#FFFFFF"; } if($holiday[$day]) $color = "#FFCCFF";//祝日の色設定 if($today==$year."/".$month."/".$day) $color = "#FFFF80";//今日の色設定 //1マス表示 $cal.="<td".$WH." bgcolor=".$color."><b>".$day."</b></td>"; //曜日を進める $weekday++; } //最後の空欄作成 while( $weekday < 7 ){ $cal.="<td".$WH."> </td>"; $weekday++; } $cal.="</tr>\n"; // 最後の</tr> $cal.="</table>"; return $cal; } function set_holiday($year, $month) { $holiday = array_fill(0, 32, false); // その月の最初の月曜日が何日かを算出 $day = 1; while(date("w",mktime(0 ,0 ,0 , $month, $day, $year)) <> 1) { $day++; } // 祝日をセット switch($month){ case 1: // 元旦 $holiday[1] = true; $holiday_name[1] = "元旦"; // 成人の日 if($year < 2000) { $holiday[15] = true; $holiday_name[15] = "成人の日"; } else { $holiday[$day+7] = true; $holiday_name[$day+7] = "成人の日"; } break; case 2: // 建国記念日 $holiday[11] = true; $holiday_name[11] = "建国記念日"; break; case 3: // 春分の日 if($year > 1979 && $year < 2100) { $tmp = floor(20.8431+($year-1980)*0.242194-floor(($year-1980)/4)); $holiday[$tmp] = true; $holiday_name[$tmp] = "春分の日"; } break; case 4: // 天皇誕生日 or みどりの日 $holiday[29] = true; if($year < 1989) { $holiday_name[29] = "天皇誕生日"; } else { $holiday_name[29] = "みどりの日"; } break; case 5: // 憲法記念日 $holiday[3] = true; $holiday_name[3] = "憲法記念日"; // 子どもの日 $holiday[5] = true; $holiday_name[5] = "子供の日"; break; case 7: // 海の日 if($year > 2002) { $holiday[$day+14] = true; $holiday_name[$day+14] = "海の日"; } elseif($year > 1994) { $holiday[21] = true; $holiday_name[21] = "海の日"; } break; case 9: // 敬老の日 if($year < 2003) { $holiday[15] = true; $holiday_name[15] = "敬老の日"; } else { $holiday[$day+14] = true; $holiday_name[$day+14] = "敬老の日"; } // 秋分の日 if($year > 1979 && $year < 2100) { $tmp = floor(23.2488+($year-1980)*0.242194-floor(($year-1980)/4)); $holiday[$tmp] = true; $holiday_name[$tmp] = "秋分の日"; } break; case 10: // 体育の日 if($year < 2000) { $holiday[10] = true; $holiday_name[10] = "体育の日"; } else { $holiday[$day+7] = true; $holiday_name[$day+7] = "体育の日"; } break; case 11: // 文化の日 $holiday[3] = true; $holiday_name[3] = "文化の日"; // 勤労感謝の日 $holiday[23] = true; $holiday_name[23] = "勤労感謝の日"; break; case 12: // 天皇誕生日 if($year > 1988) { $holiday[23] = true; $holiday_name[23] = "天皇誕生日"; } break; } // 国民の休日をセット if($year > 1985) { for($i = 1;$i < date("t",mktime(0,0,0,$month,1,$year));$i++) { if($holiday[$i] && $holiday[$i+2]) { $holiday[$i+1] = true; $holiday_name[$i+1] = "国民の休日"; $i = $i + 3; } } } // 振り替え休日をセット $sday = $day - 1; if($sday == 0) $sday = 7; for($i = $sday;$i < date("t",mktime(0, 0, 0, $month, 1, $year));$i = $i + 7) { if($holiday[$i]) { $holiday[$i+1] = true; $holiday_name[$i+1] = "振替休日"; } } return $holiday; } ?> |
カレンダー作成のポイント1: 月の日数決定
checkdate( $month, $day, $year );//有効な年月日か判定関数。戻り値はokならture、ngならfalse
あるいは、
$first_day = mktime( 0, 0, 0, $month, 1, $year );//1日のタイムスタンプ
$days = date( "t", $first_day );//月の日数
を利用する
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 |
2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
カレンダー作成のポイント2: 初日の曜日まで全角スペース挿入
//1日(月初)のタイムスタンプから「曜日」を取得
$first_day = mktime( 0, 0, 0, $month, 1, $year );//1日のタイムスタンプ
$first_weekday = date( "w", $first_day );//1日の曜日。0が日曜、1が月曜、・・・
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 |
2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |