Skip to content

Instantly share code, notes, and snippets.

@troolee
Created October 6, 2011 16:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save troolee/1267797 to your computer and use it in GitHub Desktop.
Save troolee/1267797 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
#
# Author: Pavel Reznikov <pashka.reznikov@gmail.com>
# Created: 10/6/11
#
# Id: $Id$
from datetime import datetime, timedelta
class DateRange(object):
Today = 1
Yesterday = 2
ThisWeekSunToday = 3
ThisWeekMonToday = 4
Last7Days = 5
LastWeekSunSat = 6
LastWeekMonSun = 7
LastBusinessWeek = 8
Last14Days = 9
ThisMonth = 10
Last30Days = 11
LastMonth = 12
AllTime = 13
CustomDateRange = 14
def get_date_range(range, d1=None, d2=None, d0=None):
"""
>>> from datetime import datetime
>>> d = datetime(2011, 10, 6)
>>> d.date()
datetime.date(2011, 10, 6)
>>> get_date_range(DateRange.Today)
(datetime.date(2011, 10, 6), datetime.date(2011, 10, 6))
>>> get_date_range(DateRange.Yesterday)
(datetime.date(2011, 10, 5), datetime.date(2011, 10, 5))
>>> get_date_range(DateRange.ThisWeekSunToday)
(datetime.date(2011, 10, 2), datetime.date(2011, 10, 6))
>>> get_date_range(DateRange.ThisWeekMonToday)
(datetime.date(2011, 10, 3), datetime.date(2011, 10, 6))
>>> get_date_range(DateRange.Last7Days)
(datetime.date(2011, 9, 29), datetime.date(2011, 10, 6))
>>> get_date_range(DateRange.LastWeekSunSat)
(datetime.date(2011, 9, 25), datetime.date(2011, 10, 1))
>>> get_date_range(DateRange.LastWeekMonSun)
(datetime.date(2011, 9, 26), datetime.date(2011, 10, 2))
>>> get_date_range(DateRange.LastBusinessWeek)
(datetime.date(2011, 9, 26), datetime.date(2011, 9, 30))
>>> get_date_range(DateRange.Last14Days)
(datetime.date(2011, 9, 22), datetime.date(2011, 10, 6))
>>> get_date_range(DateRange.ThisMonth)
(datetime.date(2011, 10, 1), datetime.date(2011, 10, 6))
>>> get_date_range(DateRange.Last30Days)
(datetime.date(2011, 9, 6), datetime.date(2011, 10, 6))
>>> get_date_range(DateRange.LastMonth)
(datetime.date(2011, 9, 1), datetime.date(2011, 9, 30))
>>> get_date_range(DateRange.AllTime)
(None, None)
"""
today = d0 or datetime.now()
week_ago = today - timedelta(7)
last_week_monday = week_ago - timedelta(week_ago.weekday())
one_day = timedelta(1)
first_day_of_month = today - timedelta(today.day) + one_day
first_day_of_prev_month = first_day_of_month - timedelta((first_day_of_month - one_day).day)
d1, d2 = {
DateRange.Today: (today, today),
DateRange.Yesterday: (today - one_day, today - one_day),
DateRange.ThisWeekSunToday: (today - timedelta(today.weekday() + 1), today),
DateRange.ThisWeekMonToday: (today - timedelta(today.weekday()), today),
DateRange.Last7Days: (today - timedelta(7), today),
DateRange.LastWeekSunSat: (last_week_monday - one_day, last_week_monday + timedelta(5)),
DateRange.LastWeekMonSun: (last_week_monday, last_week_monday + timedelta(6)),
DateRange.LastBusinessWeek: (last_week_monday, last_week_monday + timedelta(4)),
DateRange.Last14Days: (datetime.now() - timedelta(14), datetime.now()),
DateRange.ThisMonth: (first_day_of_month, today),
DateRange.Last30Days: (datetime.now() - timedelta(30), datetime.now()),
DateRange.LastMonth: (first_day_of_prev_month, first_day_of_month - one_day),
DateRange.AllTime: (None, None),
DateRange.CustomDateRange: (d1, d2),
}[range]
if d1:
d1 = d1.date()
if d2:
d2 = d2.date()
return d1, d2
if __name__ == '__main__':
import doctest
doctest.testmod()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment