File contents
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Written by Masaya jack Kato 2010(c)
# All right reserved.
# Licence is GPL 2.0.
from datetime import datetime
Holidays = "1/1, 1/2, 1/3, 2/11, 4/29, 5/3, 5/4, 5/5, 11/3, 11/23, 12/23, 12/31"
Payday = 23
def getToday(today = None): # None means Now
if not today:
today = datetime.now()
return today.year, today.month, today.day, today
def getEquinoxDays(y):
ymod = y % 4
seday = 20 # Spring Equinox Day
aeday = 23 # Autumnal Equinox Day
if ymod == 0: aeday = 22
elif ymod == 1:
if y > 2044: aeday = 22
elif ymod == 2:
if y < 2023: seday = 21
elif ymod == 3:
if y < 2056: seday = 21
return seday, aeday
def getNthMonday(y, m, n):
d = 1
n -= 1
while datetime(y, m, d).weekday() != 0:
d += 1
return d + n * 7
def getLastdays(holidays, year, last=31):
lastdays = []
for m in range(1, 13):
for d in range(last, last-7, -1):
try:
dt = datetime(year, m, d)
except ValueError, xe:
continue
if dt.weekday() < 5 and (m, dt.day) not in holidays:
lastdays.append((m, d))
break
return lastdays
def getHolidays(year): # hodidays near payday and last working day
holidays = Holidays.split(',')
holidays = [tuple([int(z) for z in x.split('/')]) for x in holidays]
seday, aeday = getEquinoxDays(year)
sei = getNthMonday(year, 1, 2) # 成人の日
umi = getNthMonday(year, 7, 3) # 海の日
kei = getNthMonday(year, 9, 3) # 敬老の日
tai = getNthMonday(year, 10, 2) # 体育の日
movingHolidays = [(1, sei), (3,seday), (7, umi), (9, kei), (9, aeday), (10, tai)]
if aeday - kei == 2: # isSilverweek ?
movingHolidays.append((9, kei+1))
for x in movingHolidays:
holidays.append(x)
for (m, d) in holidays: # Check substitute holidays. 6 is sunday.
if datetime(year, m, d).weekday() == 6 and (m, d) not in ((1,3), (12,31)):
holidays.append((m, d+1))
holidays.sort()
return holidays
def isPayday(today=None, payday=Payday):
y, m, d, today = getToday(today)
holidays = getHolidays(y)
paydays = getLastdays(holidays, y, payday)
lastdays = getLastdays(holidays, y, 31)
ret = []
if (m, d) in paydays:
ret.append("Payday")
if (m, d) in lastdays:
ret.append("LastWorkingDay")
if ret:
ret.append(today.ctime())
return ret
if __name__ == "__main__":
# print isPayday(datetime(2015,9,18))
x = isPayday()
if x:
print '!! '.join(x)