WebEngine

だらだらと綴る技術系メモ

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);

参考

http://qiita.com/re-24/items/c3ed814f2e1ee0f8e811