読者です 読者をやめる 読者になる 読者になる

WebEngine

web、プログラミング関係について書いていきます。あなたの優しい眼差しがブログの成長につながりますのでどうぞよろしく。

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