our
$VERSION
=
'0.01_01'
;
our
@EXPORT_OK
=
qw< datetime now >
;
our
%EXPORT_TAGS
= (
all
=> \
@EXPORT_OK
);
our
$DEFAULT_ZONE
=
'local'
;
my
%ZONE_FLAG
= (
local
=> 1,
UTC
=> 0,
GMT
=> 0 );
sub
import
{
my
@args
;
exists
$ZONE_FLAG
{
$_
} ?
$DEFAULT_ZONE
=
$_
:
push
@args
,
$_
foreach
@_
;
@_
=
@args
;
goto
&Exporter::import
;
}
sub
datetime
{
my
$zonespec
=
@_
% 2 == 0 ?
shift
:
$DEFAULT_ZONE
;
my
$datetime
=
shift
;
if
(
$datetime
=~ /^-?\d+$/ )
{
return
Date::Easy::Datetime->new(
$zonespec
,
$datetime
);
}
else
{
my
$t
= _str2time(
$datetime
,
$zonespec
);
$t
= _parsedate(
$datetime
,
$zonespec
)
unless
defined
$t
;
croak(
"Illegal datetime: $datetime"
)
unless
defined
$t
;
return
Date::Easy::Datetime->new(
$zonespec
,
$t
);
}
die
(
"reached unreachable code"
);
}
sub
now () { Date::Easy::Datetime->new }
sub
_str2time
{
my
(
$time
,
$zone
) =
@_
;
return
Date::Parse::str2time(
$time
,
$zone
eq
'local'
? () :
$zone
);
}
sub
_parsedate
{
my
(
$time
,
$zone
) =
@_
;
return
scalar
Time::ParseDate::parsedate(
$time
,
$zone
eq
'local'
? () : (
GMT
=> 1));
}
sub
new
{
my
$class
=
shift
;
my
$zonespec
=
@_
== 2 ||
@_
== 7 ?
shift
:
$DEFAULT_ZONE
;
croak(
"Unrecognized timezone specifier"
)
unless
exists
$ZONE_FLAG
{
$zonespec
};
my
$t
;
if
(
@_
== 0)
{
$t
=
time
;
}
elsif
(
@_
== 6)
{
my
(
$y
,
$m
,
$d
,
$H
,
$M
,
$S
) =
@_
;
--
$m
;
$t
=
$zonespec
eq
'local'
? timelocal(
$S
,
$M
,
$H
,
$d
,
$m
,
$y
) : timegm(
$S
,
$M
,
$H
,
$d
,
$m
,
$y
);
}
elsif
(
@_
== 1)
{
$t
=
shift
;
}
else
{
croak(
"Illegal number of arguments to datetime()"
);
}
return
scalar
$class
->_mktime(
$t
,
$ZONE_FLAG
{
$zonespec
});
}
sub
is_local {
shift
->[Time::Piece::c_islocal] }
sub
is_gmt { !
shift
->[Time::Piece::c_islocal] }
*is_utc
= \
&is_gmt
;
1;