DateTime-Lite

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN

        "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 )