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 |