- 2006-11-10 (金) 0:25
- PHP
5.2.0の新機能にDateTimeクラスがあります。既存のdate関係の関数をクラスにまとめたもののようです。
以前から思っていたのですが、日付時間データを文字列や数値で持っているのに違和感がありました。特にDBからデータを取得した際、DBで日付時間型(PostgreSQLならtimestamp型)のものはPHPでもそのまま扱えないかな、と思っていました。
そこで自分が構築しているアプリケーションではDBのレコードをModelに格納する際に自作のDateクラスに変換しています。こうしておけばそのModelを使う場合は日付時間をDateクラスのメソッドで操作できます。イメージとしては以下のような感じです。
< ?php class MyModel { /** 登録時間 */ var $regiterTime = null; } // DB からモデル生成 // .... // 年だけを取得 $model->registerTime->getYear(); // YYYY/MM/DD文字列で取得 $model->registerTime->getFormatString('Y/m/d'); ?>
日付時間は色々なフォーマットに変換して表現する(YYYY/MM/DDにしたりYYYYだけ取ったり)のでクラス化した方が後は扱いやすいと思うのですが、あまりこういった話は聞かないですね。DBの日付時間型関数が充実しているだけにPHPでも、と考えてしまいます。
そこで冒頭のDateTimeクラスです。
いずれはPDOを使ったDBアクセスではDBの日付時間型をこのクラスに変換してくれるようになって、日付時間はDateTimeクラスで扱うというのが標準になってくれれば良いなあ、と淡い期待を抱いています。
常にDateTimeクラスにされると困る人もいるでしょうから、イメージとしてはこんな感じでしょうか。
< ?php // createdの内容をDateTimeオブジェクトにする $stmt->bindColumn('created', $created, PDO::PARAM_DATE); ?>
ひそかに注目のクラスです。
2006/11/10追記:PDOとの連携を考えてみました。
かなりadhocな方法ですが、いちおうDBの日付時間型をDateTimeクラスで表現できます。
< ?php class MyModel { private function __set($name, $value) { if ($name == 'created') { $this->{$name} = new DateTime($value); } else { $this->{$name} = $value; } } } dl('php_pdo_pgsql.dll'); try { $dbh = new PDO('pgsql:host=localhost;dbname=xxx', 'xxx', 'pass'); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $dbh->prepare('SELECT id,created from users where id=?'); $stmt->execute(array('1')); while ($ret = $stmt->fetchObject('MyModel')) { printf("id:%d %04d年%02d月%02d日", $ret->id , $ret->created->format('Y') , $ret->created->format('m') , $ret->created->format('d')); } $dbh = null; } catch (PDOException $e) { print "error!: " . $e->getMessage() . "<br />"; die(); } ?>
- Newer: CakePHP1.1.10.3825-bake.php修正パッチ
- Older: CakePHP cakeError()は値を返さない
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/11/php_datetime.html/trackback
- Listed below are links to weblogs that reference
- 日付時間はDateTimeクラスで from Shin x blog