# $Id: SQLite.pm 4363 2009-12-10 16:47:25Z cfaerber $ # package DateTime::Format::SQLite; use strict; use vars qw ($VERSION); use warnings; our $VERSION = '0.11'; $VERSION = eval { $VERSION }; # "days since noon in Greenwich on November 24, 4714 B.C." my %jd0 = ( 'year' => -4713, 'month' => 11, 'day' => 24, 'hour' => 12, time_zone => 'UTC' ); use DateTime::Format::Builder ( parsers => { parse_datetime => [ # format 1 # { params => [ qw( year month day ) ], regex => qr/^(-?\d+)-(\d+)-(\d+)$/, extra => { time_zone => 'UTC' }, }, # formats 2 and 5 # { params => [ qw( year month day hour minute ) ], regex => qr/^(-?\d+)-(\d{1,2})-(\d{1,2})[Tt ](\d{1,2}):(\d{1,2})$/, extra => { time_zone => 'UTC' }, }, # formats 3, 4, 6 and 7 # { params => [ qw( year month day hour minute second nanosecond ) ], regex => qr/^(-?\d+)-(\d{1,2})-(\d{1,2})[Tt ](\d{1,2}):(\d{1,2}):(\d{1,2})(\.\d*)?$/, extra => { time_zone => 'UTC' }, postprocess => \&_fix_nanoseconds, }, # format 8 # { params => [ qw( hour minute ) ], regex => qr/^(\d{1,2}):(\d{1,2})$/, extra => { time_zone => 'UTC', 'year' => 2000, }, }, # format 9, 10 # { params => [ qw( hour minute second nanosecond ) ], regex => qr/^(\d{1,2}):(\d{1,2}):(\d{1,2})(\.\d*)?$/, extra => { time_zone => 'UTC', 'year' => 2000, }, postprocess => \&_fix_nanoseconds, }, # format 11 # { params => [ qw ( dummy ) ], regex => qr/^([Nn][Oo][Ww])$/, constructor => sub { return DateTime->now }, }, # format 12 # { params => [ qw( jd secs ) ], regex => qr/^(\d+(\.\d*)?)$/, constructor => sub { shift; my %p=(@_); return DateTime->new(%jd0)->add( 'days' => int($p{'jd'}), 'seconds' => ($p{'secs'} || 0) * (3600 * 24) ); }, }, ] }, ); *parse_date = \&parse_datetime; *parse_time = \&parse_datetime; *parse_julianday = \&parse_datetime; sub format_date { my ( $self, $dt ) = @_; $dt = $dt->clone; $dt->set_time_zone('UTC'); return $dt->ymd('-'); } sub format_time { my ( $self, $dt ) = @_; $dt = $dt->clone; $dt->set_time_zone('UTC'); return $dt->hms(':'); } sub format_datetime { my ( $self, $dt ) = @_; $dt = $dt->clone; $dt->set_time_zone('UTC'); return join ' ', $dt->ymd('-'), $dt->hms(':'); } sub format_julianday { my ( $self, $dt ) = @_; return $dt->jd; } sub _fix_nanoseconds { my %args = @_; $args{'parsed'}->{'nanosecond'} ||= 0; $args{'parsed'}->{'nanosecond'} *= 1000 * 1000 * 1000; 1; } 1; __END__ =encoding utf8 =head1 NAME DateTime::Format::SQLite - Parse and format SQLite dates and times =head1 SYNOPSIS use DateTime::Format::SQLite; my $dt = DateTime::Format::SQLite->parse_datetime( '2003-01-16 23:12:01' ); # 2003-01-16 23:12:01 DateTime::Format::SQLite->format_datetime($dt); =head1 DESCRIPTION This module understands the formats used by SQLite for its C, C and C