In [1]:
import calendar
import datetime
In [2]:
def get_day_of_nth_dow(year, month, nth, dow):
'''dow: Monday(0) - Sunday(6)'''
if nth < 1 or dow < 0 or dow > 6:
return None
first_dow, n = calendar.monthrange(year, month)
day = 7 * (nth - 1) + (dow - first_dow) % 7 + 1
return day if day <= n else None
In [3]:
print(calendar.month(2019, 1))
In [4]:
print(get_day_of_nth_dow(2019, 1, 1, 1)) # 1st Tuesday(1)
In [5]:
print(get_day_of_nth_dow(2019, 1, 2, 0)) # 2nd Monday(0)
In [6]:
print(get_day_of_nth_dow(2019, 1, 3, 6)) # 3rd Sunday(6)
In [7]:
print(get_day_of_nth_dow(2019, 1, 5, 3)) # 5th Thursday(3)
In [8]:
print(get_day_of_nth_dow(2019, 1, 5, 4))
In [9]:
print(get_day_of_nth_dow(2019, 1, 0, 4))
In [10]:
print(get_day_of_nth_dow(2019, 1, 1, 10))
In [11]:
print(get_day_of_nth_dow(2019, 1, 2, 1.8))
In [12]:
def get_date_of_nth_dow(year, month, nth, dow):
day = get_day_of_nth_dow(year, month, nth, dow)
return datetime.date(year, month, day) if day else None
In [13]:
print(get_date_of_nth_dow(2019, 1, 1, 1))
In [14]:
print(get_date_of_nth_dow(2019, 1, 1, 10))
In [15]:
# print(get_date_of_nth_dow(2019, 1, 2, 1.8))
# TypeError: integer argument expected, got float
In [16]:
print([(m, get_day_of_nth_dow(2019, m, 2, 0)) for m in range(1, 13)])
In [17]:
for y in range(2020, 2030):
print(get_date_of_nth_dow(y, 1, 2, 0))