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

Interval - handling of temporal intervals based on Date::Manip

SYNOPSIS

    use Interval;

    ### class methods ###
    Interval->setDefaultIntervalType ($OPEN_INT); 
    $int_open = new Interval ("10/10/97", "20/10/97"); 
    print "$int_open\n"        # prints  '(1997-10-10, 1997-10-20)'

    $nDefaultType = Interval->getDefaultIntervalType;

    ### constructor ###
    $i1 = new Interval ("30/10/97", "01/12/98");
    $i2 = new Interval ("20/01/96", "01/11/97", $RIGHT_OPEN_INT);

    use Date::Manip;
    $date1 = &ParseDate ("10/10/97");
    $date2 = &ParseDate ("15/10/97");
    $int = new Interval ($d1, $d2);

    ### Overload operators ###
    $i3 = $i1 + $i2;          # + gives the sum of intervals if the overlap
    print "$i3\n";            # prints '[1997-01-20, 1998-12-01)'

    $i4 = $i1 - $i2;          # - gives difference of intervals of intervals
    print "$i4\n";            # prints '[1997-11-01, 1998-12-01)'
   
    $i5 = $i1 - $i1; 
    print "$i5\n";            # prints '<empty>'

    ### <Allen overlap type> ### 
    $X = new Interval (<parameters>);
    $Y = new Interval (<parameters>);
                              ###  relationship between intervals ###
    $Y->AllenBefore ($X);             YYYYYY XXXXXX

    $Y->AllenMeets ($X);              YYYYYYXXXXXX

    $Y->AllenLeftOverlaps ($X);          XXXXXX
                                      YYYYYY

    $Y->AllenLeftCovers ($X);            XXXXXX
                                      YYYYYYYYY

    $Y->AllenCovers ($X);                XXXXXX
                                      YYYYYYYYYYYY

    $Y->AllenStarts ($X);             XXXXXX
                                      YYY

    $Y->AllenEquals ($X);             XXXXXX
                                      YYYYYY
    
    $Y->AllenRightCovers ($X);        XXXXXX
                                      YYYYYYYYY

    $Y->AllenDuring ($X);             XXXXXX
                                       YYYY

    $Y->AllenFinishes ($X);           XXXXXX
                                        YYYY 

    $Y->AllenRightOverlaps ($X);      XXXXXX
                                         YYYYYY

    $Y->AllenExtends ($X);            XXXXXXYYYYYY

    $Y->AllenAfter ($X):              XXXXXX YYYYYY

    ### <overlap type> ###
    $Y->before ($X)         same as  $Y->AllenBefore ($X)
    $Y->meets  ($X)         same as  $Y->AllenMeets ($X)

    $Y->leftOverlaps ($X)   same as  $Y->AllenLeftOverlaps ($X)  or
                                     $Y->AllenStarts ($X)

    $Y->totalOverlaps ($X)  same as  $Y->AllenCovers ($X)        or
                                     $Y->AllenLeftCovers ($X)    or
                                     $Y->AllenRightCovers ($X)   or
                                     $Y->AllenEquals ($X)

    $Y->rightOverlaps ($X)  same as  $Y->AllenFinishes ($X)      or
                                     $Y->AllenRightCovers

    $Y->during ($X)         same as  $Y->AllenDuring ($X)
    $Y->extends ($X)        same as  $Y->AllenExtends ($X)
    $Y->after ($X)          same as  $Y->AllenAfter ($X)

    ### <interval type> ###
    $closed_int = new Interval ("10/10/97", "20/10/97", $CLOSED_INT); 
    print "$closed_int\n";      # prints [1997-10-10, 1997-10-20]

    $left_open_int = new Interval ("10/10/97", "20/10/97", $LEFT_OPEN_INT); 
    print "$left_open_int\n";   # prints (1997-10-10, 1997-10-20]

    $right_open_int = new Interval ("10/10/97", "20/10/97", $RIGHT_OPEN_INT); 
    print "$right_open_int\n";  # prints [1997-10-10, 1997-10-20)

   $open_int = new Interval ("10/10/97", "20/10/97", $OPEN_INT); 
   print "$open_int\n";         # prints (1997-10-10, 1997-10-20)

   ### check and get overlapping interval ###
    $i1 = new Interval ("30/10/97", "01/12/98");
    $i2 = new Interval ("20/01/96", "01/11/97");
    $i3 = new Interval ("01/01/95", "30/04/95");

    if ($i1->overlaps ($i2)) {
        $i4 = $i1->getOverlap($i2);
        print "$i4\n";              # prints [1997-10-30, 1997-11-01)
    }
    if ($i1->overlaps ($i3)){       # tests fails, does not print anything
        $i5 = $i1->getOverlap($i2);
        print "$i5\n";
    }

DESCRIPTION

    All strings which can be used to create a Date::Manip can be used
    to create an Interval. However, the start date must be larger than
    the stop date.

    The comparison of intervals is based on the 13 ways intervals can
    overlap as defined by J.F. Allen (See litteratur). Further, I have
    included a small number of interval comparison which are handy if
    you are only interested in getting the overlapping interval of two
    intervals.

Defaults

    The default input format is non-us date format "10/12/97" is the
    10th of December 1997, not the 12 of October 1997. It can be
    changed by calling Date::Manip::DateInit().

    The default output format is YYYY-MM-DD. Can be changed by calling
    Interval->setDisplayFormat(<string>).

BUGS

    Tried my best to avoid them send me an email if you are bitten by
    a bug 

TODO

    - Cannot take references to dates as input parameters for the
      constructors

    - Cannot subtract intervals which overlap with "during" overlaps,
      this results in two intervals (currently results in an empty interval)

LITTERATURE

    Allen, J. F., "An Interval-Based Representation of Temporal Knowledge",
    Communication of the ACM, 26(11) pp. 832-843, November 1983.

AUTHOR

Kristian Torp <torp@cs.auc.dk>