The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Date::Set - Date set math

SYNOPSIS

        use Date::Set;

        my $interval = Date::Set->new('20010501')->quantize(unit=>'months');
        print "This month: ", $interval, "\n\n";
        print "Weeks this month: ", $interval->quantize(unit=>'weeks'), "\n\n";
        print "Tuesdays this month: ", $interval->quantize(unit=>'weeks')->
            offset( mode => 'begin', unit=>'days', value => [ 2, 3] );

DESCRIPTION

Date::Set is a module for date/time sets.

It requires Date::ICal. If you don't need ICal functionality, use Set::Infinite instead.

METHODS

event

        event()

Constructor. Returns 'forever', that is: (-Inf .. Inf)

period

        period( time => [time1, time2] )

Another constructor. Returns [time1 .. time2]

dtstart

        dtstart( start => time1 )

Returns set intersection [time1 .. Inf)

'dtstart' puts a limit when the event starts. If the event already starts AFTER dtstart, it will not change.

duration

        duration( unit => months, duration => 10 )

All intervals are modified to 'duration'.

'unit' parameter can be years, months, days, weeks, hours, minutes, or seconds.

rrule

    rrule ( BYMONTH => [ list ], BYWEEKNO => [ list ],
        BYYEARDAY => [ list ],   BYMONTHDAY => [ list ],
        BYDAY => [ list ],       BYHOUR => [ list ],
        BYMINUTE => [ list ],    BYSECOND => [ list ],
        BYSETPOS => [ list ],
        UNTIL => time, FREQ => freq, INTERVAL => n, COUNT => n )

Implements RRULE from RFC2445.

FREQ can be: SECONDLY MINUTELY HOURLY DAILY WEEKLY MONTHLY or YEARLY

BYDAY list may contain: SU MO TU WE TH FR SA

BYxxx items must be array references (must be bracketed): BYMONTH => [ 10 ] or BYMONTH => [ 10, 11, 12 ] or BYMONTH => [ qw(10 11 12) ]

(some documentation needed!)

occurrences

        occurrences( period => date-set )

Returns the occurrences for a given period.

INHERITED METHODS

These methods are inherited from Set::Infinite.

Logic

    $logic = $a->intersects($b);
    $logic = $a->contains($b);
    $logic = $a->is_null;

Set

    $i = $a->union($b);     
    $i = $a->intersection($b);
    $i = $a->complement;
    $i = $a->complement($b);
    $i = $a->span;   

Scalar

    $i = $a->min;
    $i = $a->max;
    $i = $a->size;  

Other set methods

    $a->real;
    $a->integer;

    quantize( parameters )
            Makes equal-sized subsets.

    select( parameters )

        Selects set members based on their ordered positions.
        Selection is more useful after quantization.

        freq     - default=1
        by       - default=[0]
        interval - default=1
        count    - dafault=infinite

    offset ( parameters )

        Offsets the subsets.

        value   - default=[0,0]
        mode    - default='offset'. Possible values are: 'offset', 'begin', 'end'.

    type($i)

        chooses an object data type. 

        type('Set::Infinite::Date');

    tolerance(0)    defaults to real sets (default)
    tolerance(1)    defaults to integer sets

Note: 'unit' parameter can be years, months, days, weeks, hours, minutes, or seconds.

BUGS

'rrule' method is not yet full RFC2445 compliant.

'byday' does not understand (scalar . string) formats yet (like '-2FR')

'duration' and 'period' methods may change in future versions, to generate open-ended sets.

'bymonth' does not accept a negative value

'WKST' is not implemented yet

'byweekno' needs a 'weekyear' quantize unit to work properly. (See: Date::Tie)

AUTHOR

Flavio Soibelmann Glock <fglock@pucrs.br> with the Reefknot team.