DBIx::Class::InflateColumn::DateTime - Auto-create DateTime objects from date and datetime columns.
Load this component and then declare one or more columns to be of the datetime, timestamp or date datatype.
package Event; __PACKAGE__->load_components(qw/InflateColumn::DateTime Core/); __PACKAGE__->add_columns( starts_when => { data_type => 'datetime' } );
NOTE: You must load InflateColumn::DateTime before Core. See DBIx::Class::Manual::Component for details.
InflateColumn::DateTime
Core
Then you can treat the specified column as a DateTime object.
print "This event starts the month of ". $event->starts_when->month_name();
If you want to set a specific timezone and locale for that field, use:
__PACKAGE__->add_columns( starts_when => { data_type => 'datetime', extra => { timezone => "America/Chicago", locale => "de_DE" } } );
If you want to inflate no matter what data_type your column is, use inflate_datetime or inflate_date:
__PACKAGE__->add_columns( starts_when => { data_type => 'varchar', inflate_datetime => 1 } ); __PACKAGE__->add_columns( starts_when => { data_type => 'varchar', inflate_date => 1 } );
It's also possible to explicitly skip inflation:
__PACKAGE__->add_columns( starts_when => { data_type => 'datetime', inflate_datetime => 0 } );
This module figures out the type of DateTime::Format::* class to inflate/deflate with based on the type of DBIx::Class::Storage::DBI::* that you are using. If you switch from one database to a different one your code should continue to work without modification (though note that this feature is new as of 0.07, so it may not be perfect yet - bug reports to the list very much welcome).
For more help with using components, see "USING" in DBIx::Class::Manual::Component.
Chains with the "register_column" in DBIx::Class::Row method, and sets up datetime columns appropriately. This would not normally be directly called by end users.
In the case of an invalid date, DateTime will throw an exception. To bypass these exceptions and just have the inflation return undef, use the datetime_undef_if_invalid option in the column info:
datetime_undef_if_invalid
"broken_date", { data_type => "datetime", default_value => '0000-00-00', is_nullable => 1, datetime_undef_if_invalid => 1 }
If you have a datetime column with the timezone extra setting, and subsenquently create/update this column with a DateTime object in the DateTime::TimeZone::Floating timezone, you will get a warning (as there is a very good chance this will not have the result you expect). For example:
timezone
__PACKAGE__->add_columns( starts_when => { data_type => 'datetime', extra => { timezone => "America/Chicago" } } ); my $event = $schema->resultset('EventTZ')->create({ starts_at => DateTime->new(year=>2007, month=>12, day=>31, ), });
The warning can be avoided in several ways:
When calling set_time_zone on a Floating DateTime object, the timezone is simply set to the requested value, and no time conversion takes place. It is always a good idea to be supply explicit times to the database:
set_time_zone
my $event = $schema->resultset('EventTZ')->create({ starts_at => DateTime->new(year=>2007, month=>12, day=>31, time_zone => "America/Chicago" ), });
__PACKAGE__->add_columns( starts_when => { data_type => 'datetime', extra => { timezone => "America/Chicago", floating_tz_ok => 1 } } );
Set the environment variable DBIC_FLOATING_TZ_OK to some true value.
Matt S. Trout <mst@shadowcatsystems.co.uk>
Aran Deltac <bluefeet@cpan.org>
You may distribute this code under the same terms as Perl itself.
To install DBIx::Class, copy and paste the appropriate command in to your terminal.
cpanm
cpanm DBIx::Class
CPAN shell
perl -MCPAN -e shell install DBIx::Class
For more information on module installation, please visit the detailed CPAN module installation guide.