» Oct 7th, 2009, category: Python , Perm Link...

I need to write a code to determine if two date ranges are intersect to each other. I found Comparing date ranges on Stack Overflow. I've converted it to Python as below code:

The implementation

def is_intersect(dt1start, dt1end, dt2start, dt2end):
    if dt2end <= dt1start or dt2start >= dt1end:
        return False

    return  dt1start <= dt2end and dt1end >= dt2start

Unit tests

def test_intersect(self):
    """
               |-------------------|         compare to this one
    1               |---------|              contained within
    2          |----------|                  contained within, equal start
    3                  |-----------|         contained within, equal end
    4          |-------------------|         contained within, equal start+end
    5     |------------|                     not fully contained, overlaps start
    6                      |-----------|     not fully contained, overlaps end
    7     |------------------------|         overlaps start, bigger
    8          |-----------------------|     overlaps end, bigger
    9     |------------------------------|   overlaps entire period


    10 |---|                                 not overlap, less than
    11 |-------|                             not overlap, end equal
    12                              |---|    not overlap, bigger than
    13                             |---|     not overlap, start equal
    """
    #1
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,6,30),   datetime(2009,10,1,6,40),
    )
    #2
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,6,0),    datetime(2009,10,1,6,30),
    )
    #3
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,6,30),   datetime(2009,10,1,7,0),
    )

    #4
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
    )
    #5
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,5,30),   datetime(2009,10,1,6,30),
    )
    #6
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,6,30),   datetime(2009,10,1,7,30),
    )

    #7
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,5,30),   datetime(2009,10,1,7,0),
    )

    #8
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,30),
    )

    #9
    assert utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,5,0),    datetime(2009,10,1,8,0),
    )

    #10 
    assert not utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,5,0),    datetime(2009,10,1,5,30),
    )

    #11
    assert not utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,5,0),    datetime(2009,10,1,6,0),
    )

    #12
    assert not utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,7,30),    datetime(2009,10,1,8,0),
    )

    #13
    assert not utils.is_intersect(
        datetime(2009,10,1,6,0),    datetime(2009,10,1,7,0),
        datetime(2009,10,1,7,0),    datetime(2009,10,1,8,0),
    )

Enjoy!

Post your comment.

captcha