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;
-
}
-
}
-
}
-
-
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=?');
-
-
-
while ($ret = $stmt->fetchObject('MyModel')) {
-
, $ret->created->format('Y')
-
, $ret->created->format('m')
-
, $ret->created->format('d'));
-
}
-
-
$dbh = null;
-
} catch (PDOException $e) {
-
}
-
?>
- Newer: CakePHP1.1.10.3825-bake.php修正パッチ
- Older: CakePHP cakeError()は値を返さない
トラックバック: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
