今月のカレンダー:テーブル
Home >> サンプルスクリプト >> 日付・時刻関連 >> 今月のカレンダー:テーブル

今月のカレンダー:テーブル

今月のカレンダー(テーブル表示)

今度はカレンダーをテーブルで表示します。以下のようなカレンダーが出来上がります。

2008年11月のカレンダー
            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            

取得したい値などは今月のカレンダー(一覧表示)と同じですので省きます。

テーブルで表示するのでもちろん<table>関連のタグを一通り使います。

  1. ○○年○月の部分はテーブルの<caption>タグを使います。
  2. 見出しタグ<th>に日〜土の曜日を配置します。
  3. 日付が存在する間、日にちを<td>タグの中に挿入しながらループし、空白セルには「&nbsp;」と空白を挿入します。
  4. それだけでは1行で表示されてしまうので曜日の数(7回)だけループしたら行を変えます。テーブルなので行を変えるには</tr><tr>タグを挿入します。
  5. 土曜日・日曜日と今日の日付の色を変更したいのでスタイルシートの設定をします
    • 日曜―文字色:(#CC3300)
    • 土曜―文字色:(#0033CC)
    • 今日―背景色:(silver)

使用する関数は今月のカレンダー(一覧表示)で使用する関数に加えてcheckdate関数です。

参考関数

  • date() ---- 日付・時刻を書式化する
  • mktime() ---- 指定した日時のUNIXタイムスタンプを取得する
  • checkdate() ---- 日付の妥当性を確認する(グレゴリオ暦)

checkdate関数は引数に指定した日付が存在すればTRUEを・存在しなければFALSEを返してくる便利な関数です。これをループの条件式に使います。

date関数で使用するフォーマット文字は今月のカレンダー(一覧表示)と一緒です。

カレンダーサンプルソース

<?php
$now_year
= date("Y"); // 現在の年を取得
$now_month = date("n"); // 在の月を取得
$now_day = date("j"); // 現在の日を取得
// 曜日の配列作成
$weekday = array( "日", "月", "火", "水", "木", "金", "土" );
// 1日の曜日を数値で取得
$fir_weekday = date( "w", mktime( 0, 0, 0, $now_month, 1, $now_year ) );

echo
'<table border="1" cellspacing="0" cellpadding="5" style="text-align:center;">';
// 見出し部分<caption>タグ出力
echo "<caption style=\"color:black; font-size:14px; padding:0px;\">"
.$now_year."年".$now_month."月のカレンダー
</caption>\n"
;

echo
"<tr>\n";

// 曜日セル<th>タグ設定
$i = 0; // カウント値リセット
while( $i <= 6 ){ // 曜日分ループ

//-------------スタイルシート設定---------------------------------
    
if( $i == 0 ){ // 日曜日の文字色
        
$style = "#C30";
    }
    else if(
$i == 6 ){ // 土曜日の文字色
        
$style = "#03C";
    }
    else{
// 月曜〜金曜日の文字色
        
$style = "black";
    }
//-------------スタイルシート設定終わり---------------------------

    // <th>タグにスタイルシートを挿入して出力
    
echo "\t<th style=\"color:".$style."\">".$weekday[$i]."</th>\n";
    
$i ++; //カウント値+1
}

// 行の変更
echo "</tr>\n";
echo
"<tr>\n";

$i = 0; //カウント値リセット(曜日カウンター)
while( $i != $fir_weekday ){ //1日の曜日まで空白(&nbsp;)で埋める
    
echo "\t<td>&nbsp;</td>\n";
    
$i ++;
}

// 今月の日付が存在している間ループする
for( $day=1; checkdate( $now_month, $day, $now_year ); $day++ ){

    
//曜日の最後まできたらカウント値(曜日カウンター)を戻して行を変える
    
if( $i > 6 ){
        
$i = 0;
        echo
"</tr>\n";
        echo
"<tr>\n";
    }

//-------------スタイルシート設定-----------------------------------
    
if( $i == 0 ){ //日曜日の文字色
        
$style = "#C30";
    }
    else if(
$i == 6 ){ //土曜日の文字色
        
$style = "#03C";
    }
    else{
//月曜〜金曜日の文字色
        
$style = "black";
    }

    
// 今日の日付の場合、背景色追加
    
if( $day == $now_day ){
        
$style = $style."; background:silver";
    }
//-------------スタイルシート設定終わり-----------------------------

    // 日付セル作成とスタイルシートの挿入
    
echo "\t<td style=\"color:".$style.";\">".$day."</td>\n";

    
$i++; //カウント値(曜日カウンター)+1
}

while(
$i < 7 ){ //残りの曜日分空白(&nbsp;)で埋める
    
echo "\t<td>&nbsp;</td>\n";
    
$i++;
}
echo
"</tr>\n";
echo
"</table>\n";
?>

出力結果

2008年11月のカレンダー
            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            

一覧表示に比べて大分カレンダーらしくなりました。