id:naoya経由で
はてブから L 社では DateTime を使ってるっぽい雰囲気を感じたので、Time::Piece + Date::Simple から脱却し、DateTime を使ってみようと思った。
http://tokuhirom.dnsalias.org/~tokuhirom/tokulog/2145.html
L社で最初にDateTime使ってたのは多分おいらだー、とこっそり言ってみる。
さて、DateTimeは開発側で結構ごにょごにょやってきたわけだけど、"formatter"という概念がしっかりしてててClass::DBIととても使いやすい。
package My::CDBI;
use strict;
use base qw(Class::DBI);
use Class::DBI::LazyInflate;
use DateTime;
use DateTime::Format::Pg;
sub pg_inflate_datetime { DateTime::Format::Pg->parse_datetime(shift) }
sub pg_deflate_datetime { DateTime::Format::Pg->format_datetime(shift) }
sub pg_inflate_duration { DateTime::Format::Pg->parse_duration(shift) }
sub pg_deflate_duration { DateTime::Format::Pg->format_duration(shift) }
sub has_datetime
{
my $class = shift;
my $field = shift;
$class->has_lazy(
$field => 'DateTime',
inflate => \&pg_inflate_datetime,
deflate => \&pg_deflate_datetime,
);
}
sub has_interval
{
my $class = shift;
my $field = shift;
$class->has_lazy(
$field => 'DateTime::Duration',
inflate => \&pg_inflate_duration,
deflate => \&pg_delfate_duration
);
}
これで普通~にDateTimeオブジェクトをTIMESTAMPやらINTERVALやらで使える。
CREATE TABLE foo (
id PRIMARY KEY,
foo_timestamp TIMESTAMP
);
package My::CDBI::Child;
use strict;
use base qw(My::CDBI)
__PACKAGE__->has_datetime('foo_timestamp');
package main;
my $foo = My::CDBI::Child->retrieve('hoge');
print $foo->foo_timestamp->ymd, "\n";
ただDateTimeは遅くて、それをどうにかしようと思ってDT::TimeZoneをXS化しようとしてたのだけど、全部XS化しようとしても全然はやくならないんだよねぇ。というわけでそのコードは今はCVSの別ブランチにほげられてるはず。とほほ。
コメント