DateTime-Lite

 view release on metacpan or  search on metacpan

README  view on Meta::CPAN

        $dt->set_day(1);
        $dt->set_hour(0);
        $dt->set_minute(0);
        $dt->set_second(0);
        $dt->set_nanosecond(0);
        $dt->set_time_zone('America/New_York');
        $dt->set_locale('en-US');  # sets a new DateTime::Locale::FromCLDR object
        $dt->set_formatter( $formatter );
        $dt->truncate( to => 'day' );   # 'year','month','week','day','hour','minute','second'

        # Works for second, minute, hour, day, week, local_week, month, quarter,
        # year, decade, century
        $dt->end_of( 'month' );
        say $dt;  # 2026-04-30T23:59:59.999999999
        $dt->start_of( 'month' );
        say $dt;  # 2026-04-01T00:00:00

        # Comparison
        my @sorted = sort { $a <=> $b } @datetimes;  # overloaded <=>
        DateTime::Lite->compare( $dt1, $dt2 );       # -1, 0, 1
        DateTime::Lite->compare_ignore_floating( $dt1, $dt2 );
        $dt->is_between( $lower, $upper );

        # Class-level settings
        DateTime::Lite->DefaultLocale('fr-FR');
        my $class = $dt->duration_class;  # 'DateTime::Lite::Duration'

        # Constants
        DateTime::Lite::INFINITY();        # +Inf
        DateTime::Lite::NEG_INFINITY();    # -Inf
        DateTime::Lite::NAN();             # NaN
        DateTime::Lite::MAX_NANOSECONDS(); # 1_000_000_000
        DateTime::Lite::SECONDS_PER_DAY(); # 86400

        # Error handling
        my $dt2 = DateTime::Lite->new( %bad_args ) ||
            die( DateTime::Lite->error );
        # Chaining: bad calls return a NullObject so the chain continues safely;
        # check the return value of the last call in the chain.
        my $result = $dt->some_method->another_method ||
            die( $dt->error );

VERSION
        v0.6.1

DESCRIPTION
    "DateTime::Lite" is a lightweight, memory-efficient, drop-in replacement
    for DateTime with the following design goals:

    Low dependency footprint
        Runtime dependencies are limited to: DateTime::Lite::TimeZone
        (bundled SQLite timezone data, with automatic fallback to
        DateTime::TimeZone if DBD::SQLite is unavailable),
        DateTime::Locale::FromCLDR (locale data via Locale::Unicode::Data's
        SQLite backend), Locale::Unicode, and core modules.

        The heavy Specio, Params::ValidationCompiler, Try::Tiny, and
        "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



( run in 0.682 second using v1.01-cache-2.11-cpan-df04353d9ac )