Personal tools
You are here: Home download payday.py
Document Actions

payday.py

by jack last modified 2010-09-09 07:26 PM

Click here to get the file

Size 2.6 kB - File type text/python-source

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)
 
そちらのOSの時刻なので 正確性はあなた次第
 
こういう意味のないの好き
 
本をお勧め中
 
CDもお勧め中
のだめカンタービレ ベスト100
ドラマの演奏とは違います。でもこの感じでこの価格ならアリかと
 
消耗品や家電
 
よく使うサイト
社名ロゴ88×631
 
ぐぐってみる
 
誰が使うんだろう
 

Powered by Plone