Hledaní začalo mým dotazem v konferenci:
hledam funkci kalendare -neco jako rozsireni k modulu time- na overeni nepracovnich dnu a svatku(ceskych). Vim, ze bych si to mohl napsat sam, ale nechci vymyslet vec, kterou uz urcite nekdo vymyslel :-)
Pak následovalo pár odpovědí, které mě moc neuspokojovaly, takže jsem to vyřešil jednoduše pomocí modulu calendar. (jvit)
def nepracovniDen(rrrr,mm,dd): """Vrati 0 kdyz je statni svatek nebo vikend.""" import calendar datum = (mm,dd) svatky = ((1,1),velikonoce(rrrr),(5,1),(5,8),(7,5),(7,6),(9,28), (10,28),(11,17),(12,24),(12,25),(12,26)) vikend = (5,6) if datum in svatky or calendar.weekday(rrrr,mm,dd) in vikend: return 0 else: return 1 def velikonoce(year): import time century = year/100 G = year % 19 K = (century - 17)/25 I = (century - century/4 - (century - K)/3 + 19*G + 15) % 30 I = I - (I/28)*(1 - (I/28)*(29/(I + 1))*((21 - G)/11)) J = (year + year/4 + I + 2 - century + century/4) % 7 L = I - J EasterMonth = 3 + (L + 40)/44 EasterDay = L + 28 - 31*(EasterMonth/4) pondeli = time.mktime((year,EasterMonth,EasterDay,) + time.localtime()[3:]) + 86400 return time.localtime(pondeli)[1:3]
Pak jsem ještě potřeboval najít univerzálně nejbližší pracovní den, pokud je svátek nebo víkend. Funkce vrací string, který mi pro mé účely vyhovoval. Vzhledem k tomu, ze metoda mktime() chce jako argument 9. místnou n-tici, doplňuji to ořezaným time.localtime()[3:]?.
def najdiPracovniDen(stav,rrrr,mm,dd,den=86400): """Hleda nejblizsi pracovni den. Pokud je svatek nebo vikend, zkousi dalsi den. Stav: 1 - pro pracovni den; 0 - pro svatek. Hledame dopredu,dokud nenalezneme prvni mozny pracovni den. Vraci string ve formatu 'RRRRMMDD'""" import time sec = time.mktime((rrrr,mm,dd,) + time.localtime()[3:]) while stav == 0: sec += den rrrr,mm,dd = time.localtime(sec)[:3] stav = nepracovniDen(rrrr,mm,dd) return time.strftime('%Y%m%d',time.localtime(sec))
Následující kód ukazuje celý skript pro výpočet Velikonočních nedělí. Ještě jednou... POZOR! Počítá to NEDĚLE! Kód vložte do souboru velikonoce.py
. Kódování si upravte podle sebe, případně vyhoďte české znaky (pepr):
# -*- coding: cp1250 -*- def velikonoce(year): u"""Oudinův algoritmus pro výpočet velikonoční neděle. Platí pro celé období Gregoriánského kalendáře, tj. od roku 1582. Zdroj: http://www.smart.net/~mmontes/oudin.html""" century = year/100 G = year % 19 K = (century - 17)/25 I = (century - century/4 - (century - K)/3 + 19*G + 15) % 30 I = I - (I/28)*(1 - (I/28)*(29/(I + 1))*((21 - G)/11)) J = (year + year/4 + I + 2 - century + century/4) % 7 L = I - J EasterMonth = 3 + (L + 40)/44 EasterDay = L + 28 - 31*(EasterMonth/4) return "%d.%d.%d" % (EasterDay, EasterMonth, year) def main(): f = open('velikonoce.txt', 'w') for year in xrange(1900, 3000): f.write(velikonoce(year) + '\n') f.close() if __name__=="__main__": main()