- 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

