Home > PHP > 日付時間はDateTimeクラスで

日付時間はDateTimeクラスで

  • 2006-11-10 (金) 0:25
  • PHP
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 357

5.2.0の新機能にDateTimeクラスがあります。既存のdate関係の関数をクラスにまとめたもののようです。

以前から思っていたのですが、日付時間データを文字列や数値で持っているのに違和感がありました。特にDBからデータを取得した際、DBで日付時間型(PostgreSQLならtimestamp型)のものはPHPでもそのまま扱えないかな、と思っていました。

そこで自分が構築しているアプリケーションではDBのレコードをModelに格納する際に自作のDateクラスに変換しています。こうしておけばそのModelを使う場合は日付時間をDateクラスのメソッドで操作できます。イメージとしては以下のような感じです。

PHP:
  1. <?php
  2. class MyModel {
  3.   /** 登録時間 */
  4.   var $regiterTime = null;
  5. }
  6.  
  7. // DB からモデル生成
  8. // ....
  9.  
  10. // 年だけを取得
  11. $model->registerTime->getYear();
  12. // YYYY/MM/DD文字列で取得
  13. $model->registerTime->getFormatString('Y/m/d');
  14. ?>

日付時間は色々なフォーマットに変換して表現する(YYYY/MM/DDにしたりYYYYだけ取ったり)のでクラス化した方が後は扱いやすいと思うのですが、あまりこういった話は聞かないですね。DBの日付時間型関数が充実しているだけにPHPでも、と考えてしまいます。

そこで冒頭のDateTimeクラスです。

いずれはPDOを使ったDBアクセスではDBの日付時間型をこのクラスに変換してくれるようになって、日付時間はDateTimeクラスで扱うというのが標準になってくれれば良いなあ、と淡い期待を抱いています。

常にDateTimeクラスにされると困る人もいるでしょうから、イメージとしてはこんな感じでしょうか。

PHP:
  1. <?php
  2.   // createdの内容をDateTimeオブジェクトにする
  3.   $stmt->bindColumn('created', $created, PDO::PARAM_DATE);
  4. ?>

ひそかに注目のクラスです。

 

2006/11/10追記:PDOとの連携を考えてみました。

かなりadhocな方法ですが、いちおうDBの日付時間型をDateTimeクラスで表現できます。

PHP:
  1. <?php
  2. class MyModel {
  3.   private function __set($name, $value) {
  4.     if ($name == 'created') {
  5.       $this->{$name} = new DateTime($value);
  6.     } else {
  7.       $this->{$name} = $value;
  8.     }
  9.   }
  10. }
  11.  
  12. dl('php_pdo_pgsql.dll');
  13. try {
  14.   $dbh = new PDO('pgsql:host=localhost;dbname=xxx', 'xxx', 'pass');
  15.   $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  16.   $stmt = $dbh->prepare('SELECT id,created from users where id=?');
  17.  
  18.   $stmt->execute(array('1'));
  19.  
  20.   while ($ret = $stmt->fetchObject('MyModel')) {
  21.     printf("id:%d %04d年%02d月%02d日", $ret->id
  22.                                     , $ret->created->format('Y')
  23.                                     , $ret->created->format('m')
  24.                                     , $ret->created->format('d'));
  25.   }
  26.  
  27.   $dbh = null;
  28. } catch (PDOException $e) {
  29.    print "error!: " . $e->getMessage() . "<br />";
  30.    die();
  31. }
  32. ?>

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2006/11/php_datetime.html/trackback
Listed below are links to weblogs that reference
日付時間はDateTimeクラスで from Shin x blog

Home > PHP > 日付時間はDateTimeクラスで

検索
フィード
メタ情報

Return to page top