PHP簡易カレンダー作成
DateTimeクラスで簡易カレンダーを実装
date()関数で書いても良いのですが、サンプルがインターネット上に結構あったので、今回はDateTimeクラスで実装してみようと思います。DateTimeクラスは日付をオブジェクトとして扱うことのできるクラスです。個人的には、date()関数よりすっきり書ける印象で、こちらの方が好きです。
※ DateTimeクラスはPHP 5.2.0以降から利用可能です。
<?php $weekday = array('日','月','火','水','木','金','土'); $day = 1; $datetime = new DateTime("Asia/Tokyo"); /* 現在の年、月を取得 */ $year = $datetime->format('Y'); $month = $datetime->format('m'); /* 現在の月の1日目の曜日を割り出すため現在の日付を1日目として設定する */ $datetime->setDate($year, $month, 1); $firstWeekDay = (int)$datetime->format('w'); $lastDay = (int)$datetime->format('t'); ?> <!DOCTYPE html> <html lang="ja"> <meta charset="utf-8"> <head> <title>PHPカレンダ</title> </head> <body> <table> <figcaption><?=$year.'年'.$month.'月'?></figcaption> <tr> <?php foreach($weekday as $value): ?> <th><?=$value?></th> <?php endforeach; ?> </tr> <?php /* 1日目がはじまるのが日曜じゃないなら、 はじまるまでの数日分を空白で埋める */ for ($i=0; $i<$firstWeekDay; $i++) { echo '<td> </td>'; } /* 6(週)*7(曜日)=42のマスでカレンダを構成 */ for ($cell=$firstWeekDay; $cell<42; $cell++) { /* 日曜日に改行させたいから */ if ($cell%7 === 0) { echo '</tr><tr>'; } /* 日付を出力、最終日を過ぎれば空白で埋める */ if ($day <= $lastDay) { echo '<td>'.$day.'</td>'; } else { echo '<td> </td>'; } $day++; } ?> </tr> </table> </body> </html>
あんまり綺麗なコードじゃありませんね・・・。将来再チャレンジして、どのくらい成長したか計ってみるのも良いかもしれません。
タイムゾーンの確認
DateTimeクラスをインスタンス化する際、引数にタイムゾーンを設定していますが、この方法は、あまり見かけません。(あんまり良くないのかもしれない)
通常は
<?php $datetime->setTimezone(new DateTimeZone('Asia/Tokyo'));
みたいに書きます。
下記のコードで時間帯がどこに設定されているかチェック可能です。
<?php $timeZone = $datetime->getTimezone(); echo $timeZone->getName();
ダンプしても確認できました。
<?php var_dump($datetime);