DateTime-Lite
view release on metacpan or search on metacpan
"namespace::autoclean" are eliminated entirely.
Low memory footprint
"DateTime" loads a cascade of modules which inflates %INC
significantly. "DateTime::Lite" avoids this via selective lazy
loading.
Accurate timezone data from TZif binaries
"DateTime::TimeZone" derives its zone data from the IANA Olson
*source* files ("africa", "northamerica", etc.) via a custom text
parser ("DateTime::TimeZone::OlsonDB"), then pre-generates one ".pm"
file per zone at distribution build time. This introduces an extra
parsing step that is not part of the official IANA toolchain.
"DateTime::Lite::TimeZone" instead compiles the IANA source files
with zic(1), which is the official IANA compiler, and reads the
resulting TZif binary files directly, following RFC 9636
<https://www.rfc-editor.org/rfc/rfc9636> (TZif versions 1 through
4). Timestamps are stored as signed 64-bit integers, giving a range
of roughly "+/-" 292 billion years.
Crucially, the POSIX footer TZ string embedded in every TZif v2+
file, such as "EST5EDT,M3.2.0,M11.1.0", is extracted and stored in
the SQLite database.
This string encodes the recurring DST rule for all dates beyond the
last explicit transition. At runtime, "DateTime::Lite::TimeZone"
evaluates the footer rule via an XS implementation of the IANA
"tzcode" reference algorithm (see "dtl_posix.h", derived from
"tzcode2026a/localtime.c", public domain), ensuring correct timezone
calculations for any date in the future without expanding the full
transition table.
XS-accelerated hot paths
The XS layer covers all CPU-intensive calendar arithmetic
("_rd2ymd", "_ymd2rd", "_seconds_as_components", all leap-second
helpers), plus new functions not in the original: "_rd_to_epoch",
"_epoch_to_rd", "_normalize_nanoseconds", and "_compare_rd".
Compatible API
The public API mirrors DateTime as closely as possible, so existing
code using "DateTime" should work with "DateTime::Lite" as a drop-in
replacement.
Full Unicode CLDR / BCP 47 locale support
"DateTime" is limited to the set of pre-generated
"DateTime::Locale::*" modules, one per locale. "DateTime::Lite"
accepts any valid Unicode CLDR / BCP 47 locale tag, including
complex forms with Unicode extensions ("-u-"), transform extensions
("-t-"), and script subtags.
my $dt = DateTime::Lite->now( locale => 'en' ); # simple form
my $dt = DateTime::Lite->now( locale => 'en-GB' ); # simple form
# And more complex forms too
my $dt = DateTime::Lite->now( locale => 'he-IL-u-ca-hebrew-tz-jeruslm' );
my $dt = DateTime::Lite->now( locale => 'ja-Kana-t-it' );
my $dt = DateTime::Lite->now( locale => 'ar-SA-u-nu-latn' );
Locale data is resolved dynamically by DateTime::Locale::FromCLDR
via Locale::Unicode::Data, so tags like
"he-IL-u-ca-hebrew-tz-jeruslm" or "ja-Kana-t-it" work transparently
without any additional installed modules.
Additionally, if the locale tag carries a Unicode timezone extension
("-u-tz-"), and no explicit "time_zone" argument is provided to the
constructor, "DateTime::Lite" will automatically resolve the
corresponding IANA canonical timezone name from it:
# time_zone is inferred as 'Asia/Jerusalem' from the -u-tz-jeruslm extension
my $dt = DateTime::Lite->now( locale => 'he-IL-u-ca-hebrew-tz-jeruslm' );
say $dt->time_zone; # Asia/Jerusalem
say $dt->time_zone_long_name; # Asia/Jerusalem
An explicit "time_zone" argument always takes priority over the
locale extension.
No die() in normal operation
Following the Module::Generic / Locale::Unicode error-handling
philosophy, "DateTime::Lite" never calls "die()" in normal error
paths.
Instead it sets a DateTime::Lite::Exception object and returns
"undef" in scalar context, or an empty list in list context.
However, if you really want this module to "die" upon error, you can
pass the "fatal" option with a true value upon object instantiation.
KNOWN DIFFERENCES FROM DateTime
Validation
"DateTime" uses Specio / Params::ValidationCompiler for constructor
validation. "DateTime::Lite" performs equivalent checks manually.
Error messages are similar but not identical.
No warnings::register abuse
"DateTime::Lite" uses "warnings::enabled" consistently and does not
depend on the "warnings::register" mechanism for user-facing output.
METHODS NOT IMPLEMENTED
None at this time. If you encounter a method missing from the DateTime
API, please file a report.
CONSTRUCTORS
new
Accepted parameters are:
* "year" (required)
* "month"
* "day"
* "hour"
* "minute"
* "second"
* "nanosecond"
* "time_zone"
( run in 1.881 second using v1.01-cache-2.11-cpan-39bf76dae61 )