—# $Id: SQLite.pm 4363 2009-12-10 16:47:25Z cfaerber $
#
package
DateTime::Format::SQLite;
use
strict;
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'
);
(
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<date>, C<datetime> and C<time> functions. It can be used to
parse these formats in order to create L<DateTime> objects, and it
can take a DateTime object and produce a timestring accepted by
SQLite.
B<NOTE:> SQLite does not have real date/time types but stores
everything as strings. This module deals with the date/time
strings as understood/returned by SQLite's C<date>, C<time>,
C<datetime>, C<julianday> and C<strftime> SQL functions.
You will usually want to store your dates in one of these formats.
=head1 METHODS
This class offers the methods listed below. All of the parsing
methods set the returned DateTime object's time zone to the B<UTC>
zone because SQLite does always uses UTC for date calculations.
This means your dates may seem to be one day off if you convert
them to local time.
=over 4
=item * parse_datetime($string)
Given a C<$string> representing a date, this method will return a new
C<DateTime> object.
The C<$string> may be in any of the formats understood by SQLite's
C<date>, C<time>, C<datetime>, C<julianday> and C<strftime> SQL
functions or it may be in the format returned by these functions
(except C<strftime>, of course).
The time zone for this object will always be in UTC because SQLite
assumes UTC for all date calculations.
If C<$string> contains no date, the parser assumes 2000-01-01
(just like SQLite).
If given an improperly formatted string, this method may die.
=item * parse_date($string)
=item * parse_time($string)
=item * parse_julianday($string)
These are aliases for C<parse_datetime>, for symmetry with
C<format_I<*>> functions.
=item * format_date($datetime)
Given a C<DateTime> object, this methods returnes a string in the
format YYYY-MM-DD, i.e. in the same format SQLite's C<date>
function uses.
=item * format_time($datetime)
Given a C<DateTime> object, this methods returnes a string in the
format HH:MM:SS, i.e. in the same format SQLite's C<time>
function uses.
=item * format_datetime($datetime)
Given a C<DateTime> object, this methods returnes a string in the
format YYYY-MM-DD HH:MM:SS, i.e. in the same format SQLite's C<datetime>
function uses.
=item * format_julianday($datetime)
Given a C<DateTime> object, this methods returnes a string in the
format DDDDDDDDDD, i.e. in the same format SQLite's C<julianday>
function uses.
=back
=head1 AUTHOR
Claus Färber <CFAERBER@cpan.org>
based on C<DateTime::Format::MySQL> by David Rolsky.
=head1
Copyright © 2008 Claus Färber.
Copyright © 2003 David Rolsky.
This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.
The full text of the license can be found in the LICENSE file
included with this module.
=head1 SEE ALSO
=cut