WebプログラミングU PHP

 目次へ 

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.">&nbsp;</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.">&nbsp;</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