Skip to content

Instantly share code, notes, and snippets.

@luw2007
Last active August 29, 2015 13:56
Show Gist options
  • Save luw2007/6526dab88a7e444dacaf to your computer and use it in GitHub Desktop.
Save luw2007/6526dab88a7e444dacaf to your computer and use it in GitHub Desktop.
西藏日历 2008-2015

#西藏日历 2008-2015

目的

项目中需要能够生成藏历, 但是藏历并不像农历那样, 有特定的规则. 而且也没有对照表. 网上可以查询到的基本都是当年或者往年的日历, 因此只能每年更新.

例子

>>> from datetime import datetime
>>> zl = ZLCalendar(datetime(2013,10,15))
>>> print zl.zldate
水蛇年闰具贤月十一日/缺十二日
>>> zl = ZLCalendar(datetime(2015,5,18))
>>> print zl.zldate
木羊年具香月三十日
>>> print zl.zljieri['name']
萨嘎达瓦(佛吉祥日)开始

更新

按照公历和藏历的对照表, 完成 XZ_RCQ中的每月的重/缺情况, 常见情况如下::

w01 -> w 表示本月没有重或缺, 01表示1月
q0102 -> q 表示缺, 01 表示1月, 02 表示藏历初二, 即: 1月没有初二
c0304 -> c 表示重, 03 表示3月, 04 表示藏历初四, 即: 3月有两个初四
首字母大小(W, Q C) 表示当月为藏历闰月

根据农历和藏历的对照表, 完成 XZ_BEGAIN_30 中农历月出一, 但是藏历为上月30的情况.

# -*- coding: utf-8 -*-
'''
Created on 2009-11-7
@author: ysm cleverysm@gmail.com
数据来自wangfei@hanwang.com.cn
新增2015年藏历
by luw2007@mgail.com
Thu Jan 15 17:19:39 CST 2015
新增藏历 ZLCalendar
by luw2007@mgail.com
Thu Feb 13 14:01:28 CST 2014
>>> from datetime import datetime
>>> zl = ZLCalendar(datetime(2013,10,15))
>>> print zl.zldate
水蛇年闰具贤月十一日/缺十二日
>>> zl = ZLCalendar(datetime(2015,5,18))
>>> print zl.zldate
木羊年具香月三十日
>>> print zl.zljieri['name']
萨嘎达瓦(佛吉祥日)开始
'''
import datetime
# 农历月中, 第一天是藏历30号的月份
XZ_BEGAIN_30 = {
2008: (3, 4, 6, 7, 9),
2009: (1, 4, 5, 8, 10),
2010: (3, 5, 7, 8, 10, 12),
2011: (1, 3, 4, 6, 7, 9),
2012: (2, 3, 4, 5, 6, 7, 8, 10),
2013: (1, 3, 5, 6, 8, 10, 12),
2014: (2, 4, 6, 8, 10, 12),
2015: (2, 4, 5, 6, 7, 8, 11),
2016: (),
}
XZ_RCQ = {
2008: ["q0115c0118", "q0208c0222", "q0302", "Q0306c0316q0329", "w04", "q0502c0512q0525", "q0627", "c0709q0720",
"q0824", "c0903q0917", "q1023c1026", "q1116c1130", "q1210"],
2009: ["q0115c0121", "q0209c0225", "q0302", "q0406c0420", "w05", "q0602c0617", "q0727", "c0813q0820", "q0924",
"c1007q1018", "q1123c1129", "q1217"],
2010: ["c0102q0111", "q0216c0225", "q0310", "q0414c0419", "q0506c0526q0527", "q0609c0616", "Q0602",
"q0705c0712q0728", "w08", "q0902c0906q0925", "c1010q1019", "q1124",
"c1202q1218"],
2011: ["c0105q0112", "q0217c0229", "q0310", "q0413c0424", "q0506", "q0609c0621", "q0702", "q0805c0816q0828", "w09",
"q1002c1010q1026", "c1113q1120", "q1225"],
2012: ["c0105q0119", "c0209q0212q0225", "q0317", "c0403q0410", "q0513c0529", "q0606", "q0709c0725", "q0801",
"q0905c0920q0929", "w10", "q1103c1113q1127", "c1217q1221"],
2013: ["q0126", "c0208q0220", "q0324", "c0402q0418", "q0521c0528" "q0613", "q0716c0724", "q0809", "Q0812c0820",
"q0906c0924q0929", "w10", "q1104c1116q1128", "w12"],
2014: ["q0104c0107q0127", "c0212q0221", "q0325", "c0406q0418", "q0520", "c0603q0613", "q0716c0729", "q0809",
"q0913c0923", "q1006", "q1118c1125", "q1205c1219q1230"],
2015: ["w01", "q0204c0211q0228", "q0321c0315", "q0425", "c0511q0517", "q0620", "c0708q0712q0724c0727", "q0816",
"c0903q0909", "q1013c1027", "q1107", "w12"],
2016: ["w01", "w02", "w03", "w04", "w05", "w06", "w07", "w08", "w09", "w10", "w11", "w12"],
}
ZH_MONTH = {
0: "闰", 1: "正月", 2: "二月", 3: "三月", 4: "四月", 5: "五月", 6: "六月",
7: "七月", 8: "八月", 9: "九月", 10: "十月", 11: "十一月",
12: "腊月"
}
ZH_DAY = {
1: "初一", 2: "初二", 3: "初三", 4: "初四", 5: "初五", 6: "初六", 7: "初七", 8: "初八", 9: "初九", 10: "初十",
11: "十一", 12: "十二", 13: "十三", 14: "十四", 15: "十五", 16: "十六", 17: "十七", 18: "十八", 19: "十九", 20: "二十",
21: "廿一", 22: "廿二", 23: "廿三", 24: "廿四", 25: "廿五", 26: "廿六", 27: "廿七", 28: "廿八", 29: "廿九", 30: "三十"
}
TIAN_GAN = ("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸")
DI_ZHI = ("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥")
SHU_XIANG = ("鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪")
HOUR_GANZHI_1 = {
0: "子时", 1: "丑时", 2: "丑时", 3: "寅时", 4: "寅时", 5: "卯时", 6: "卯时",
7: "辰时", 8: "辰时", 9: "巳时", 10: "巳时", 11: "午时", 12: "午时",
13: "未时", 14: "未时", 15: "申时", 16: "申时", 17: "酉时", 18: "酉时",
19: "戌时", 20: "戌时", 21: "亥时", 22: "亥时", 23: "子时", 24: "子时"
}
HOUR_GANZHI_2 = {
0: "子正", 1: "丑初", 2: "丑正", 3: "寅初", 4: "寅正", 5: "卯初", 6: "卯正",
7: "辰初", 8: "辰正", 9: "巳初", 10: "巳正", 11: "午初", 12: "午正",
13: "未初", 14: "未正", 15: "申初", 16: "申正", 17: "酉初", 18: "酉正",
19: "戌初", 20: "戌正", 21: "亥初", 22: "亥正", 23: "子初", 24: "子正"
}
JIE_QI_NAME = ("小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至",
"小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至")
HOUR_GANZHI = HOUR_GANZHI_2
HOLIDAY = {
"XIZANG": {
'0101': {"name": "洛萨(藏历新年)",
"info": "别名“洛赛”。藏族一年当中最盛大的节日。藏历1月1日开始,三五天不等。29日晚饭前,要在灶房正中墙上用干面粉撒上“八吉祥徽”。晚上各家要吃面团土巴。初一这天,将青苗、油果子、羊头五谷斗摆放在佛龛几上,预祝新的一年长寿粮丰,天不亮家庭主妇们便从河里背回“吉祥水”,然后唤醒全家人,按辈分排定座位。长辈端来五谷斗,每人先抓几粒,向天撒去,表示祭神,然后依次抓一点送进嘴里。初一,一般人家闭门欢聚,互不走访。初二,亲友之间互相登门祝贺,互赠哈达。"},
'0103': {"name": "赛马会", "info": "拉萨赛马场会举行赛马会。"},
'0104': {"name": "莫朗钦茂(传昭大法会)开始",
"info": "又称祈愿大法会,藏语称“莫朗钦茂”,是西藏最大的宗教节日。节期从藏历1月4日到1月25日。届时,拉萨哲蚌寺、色拉寺、甘丹寺三大寺庙的僧人都集中在拉萨大昭寺。各大喇嘛寺都要举行盛大的酥油花展,以五色酥油塑造各种人物、动物、花卉,大者数尺,小者数寸,做工精美,形象逼真,件件堪称艺术珍品,这是寺院僧尼的创作与创造。藏民纷纷到寺院欣赏僧尼们的杰作,观看酥油花展,并同僧尼一起举行迎佛、转经等宗教仪式,具有浓厚的宗教气氛。"},
'0125': {"name": "莫朗钦茂(传昭大法会)结束",
"info": "又称祈愿大法会,藏语称“莫朗钦茂”,是西藏最大的宗教节日。节期从藏历1月4日到1月25日。届时,拉萨哲蚌寺、色拉寺、甘丹寺三大寺庙的僧人都集中在拉萨大昭寺。各大喇嘛寺都要举行盛大的酥油花展,以五色酥油塑造各种人物、动物、花卉,大者数尺,小者数寸,做工精美,形象逼真,件件堪称艺术珍品,这是寺院僧尼的创作与创造。藏民纷纷到寺院欣赏僧尼们的杰作,观看酥油花展,并同僧尼一起举行迎佛、转经等宗教仪式,具有浓厚的宗教气氛。"},
'0115': {"name": "坚俄曲巴(酥油花灯节)",
"info": "别名摆花节,藏语称“坚俄曲巴”。为了庆祝释迦牟尼与其他教派辩论的胜利,人们聚集于拉萨八角街,白天朝佛、转经,入夜满街搭起各种花架,高达十五米左右,放上用彩色酥油捏成的神仙、人物、花木、鸟兽等形象并点燃酥油灯进行祝福。另外,还有木偶表演。老百姓们围着酥油灯载歌载舞。"},
'0330': {"name": "萨嘎达瓦(佛吉祥日)开始",
"info": "藏传佛教信徒认为:藏历4月是佛月,藏语称为“萨噶达瓦”,而藏历4月15日是佛祖释迦牟尼诞辰、悟道、圆寂的日子。因而“萨噶达瓦”节期间,各地藏族群众在这月中都要朝佛念经,磕长头,禁止屠宰牲畜,积功德,并祈祷丰收。"},
'0415': {"name": "萨嘎达瓦(佛吉祥日)结束",
"info": "藏传佛教信徒认为:藏历4月是佛月,藏语称为“萨噶达瓦”,而藏历4月15日是佛祖释迦牟尼诞辰、悟道、圆寂的日子。因而“萨噶达瓦”节期间,各地藏族群众在这月中都要朝佛念经,磕长头,禁止屠宰牲畜,积功德,并祈祷丰收。"},
'0604': {"name": "朱巴次西(朝山节)",
"info": "佛教者们认为这一天是释迦牟尼第一次举行讲经的日子,所以这天人们穿着新衣,带着食品,赶往拉萨附近山上的各寺朝佛、念经,之后到野外尽情餐饮、跳舞,直到日落才返回城里。 "},
'0629': {"name": "雪顿节开始",
"info": "雪顿节是每年藏历6月底7月初,是西藏传统的节日。在藏语中,“雪”是酸奶的意思,“顿”是“吃”、“宴”的意思,雪顿节按藏语解释就是吃酸奶的节日,因此又叫“酸奶节”。因为雪顿节期间有隆重热烈的藏戏演出和规模盛大的晒佛仪式,所以有人也称之为“藏戏节”、“晒佛节”。"},
'0707': {"name": "雪顿节结束",
"info": "雪顿节是每年藏历6月底7月初,是西藏传统的节日。在藏语中,“雪”是酸奶的意思,“顿”是“吃”、“宴”的意思,雪顿节按藏语解释就是吃酸奶的节日,因此又叫“酸奶节”。因为雪顿节期间有隆重热烈的藏戏演出和规模盛大的晒佛仪式,所以有人也称之为“藏戏节”、“晒佛节”。"},
'1015': {"name": "白拉堆庆(仙女节)", "info": "又名“天母节”。每年藏历10月15日,各地都要举行一些宗教活动。妇女认为仙女节是自己的节日,所以十分活跃,最为高兴。"},
'1227': {"name": "色拉寺金刚杵加持节",
"info": "色拉崩坚(色拉寺金刚杵加持节) 作为藏历新年藏传佛教信教群众迎新年许愿活动的序幕,每年的藏历12月27日凌晨起,藏传佛教格鲁派寺院色拉寺都举行“色拉崩坚”宗教活动。“色拉崩坚”意为“色拉寺金刚杵加持节”,每年藏历12月27日凌晨开始,为期1天。届时,来自各地的藏传佛教信教群众将在色拉寺马头明王大殿前接受金刚杵的摸顶和赐福,广大信教群众还将向一旁悬挂的色拉寺最重要的文物“马头明王”唐卡祈祷。"},
'1229': {"name": "古突(驱鬼节)",
"info": "别名“古突”。藏历12月29日这一天,各地寺庙要举行一次盛大的跳神活动。家家户户扫净尘土,将房屋布置一新,驱鬼消灾,迎接新年。人们认为新年将到,一切妖魔脏物必须除净,以求新年风调雨顺、人寿年丰。"},
'1024': {"name": "甘丹阿曲(燃灯节)",
"info": "燃灯节是为了纪念佛教改革家、格鲁派创始人宗喀巴大师及他的弟子绛钦却杰的逝世而举行的活动,于每年藏历10月25日举行。这天凡属该教派的各大小寺庙、各村寨牧民,都要在寺院内外的神坛上,家中的经堂里,点酥油灯,昼夜不灭。"},
'1025': {"name": "甘丹阿曲(燃灯节)",
"info": "燃灯节是为了纪念佛教改革家、格鲁派创始人宗喀巴大师及他的弟子绛钦却杰的逝世而举行的活动,于每年藏历10月25日举行。这天凡属该教派的各大小寺庙、各村寨牧民,都要在寺院内外的神坛上,家中的经堂里,点酥油灯,昼夜不灭。"},
},
"SOLAR": {
"0101": "元旦", "0214": "情人节", "0308": "妇女节", "0312": "植树节", "0315": "消费者", "0401": "愚人节", "0422": "地球日",
"0501": "劳动节", "0504": "青年节",
"0601": "儿童节", "0701": "建党节", "0801": "建军节", "0910": "教师节", "0918": "九一八", "1001": "国庆节",
},
"LUNAR": {"0101": "春节", "0115": "元宵", "0505": "端午节", "0707": "七夕", "0715": "中元", "0815": "中秋节", "0909": "重阳",
"1208": "腊八", "1223": "小年", "1230": "除夕"},
"WEEK": {"0520": "母亲节", "0630": "父亲节"}, # 0520表示:(05)月第(2)个星期(0)。 0-6表示周日到周六。
}
XZ_SHIZAIRI = {1: "禅定胜王佛节", 8: "药师佛节", 10: "千劫佛节", 15: "阿弥陀佛节", 18: "观世音菩萨节", 21: "地藏菩萨节", 25: "莲师节", 30: "释迦牟尼佛节"}
XZ_Gan = ("木", "木", "火", "火", "土", "土", "铁", "铁", "水", "水")
XZ_MONTH = {1: "神变月", 2: "苦行月", 3: "具香月", 4: "萨嘎月", 5: "作净月", 6: "明净月", 7: "具醉月", 8: "具贤月", 9: "天降月", 10: "持众月",
11: "庄严月",
12: "满意月"}
####################ChineseCalendar150定义开始####################
class ChineseCalendar150():
"""中国农历类,可以将公立时间转换为农历时刻,起始时间为1901年2月19日,截止于2050年12月31日
代码参考了wangfei@hanwang.com.cn这位朋友的代码,数据大部分也用的是其代码中附带的数据,在此表示感谢
本类中月干支以每个月的初一为起点,年干支以正月初一为起点,使用24节气为分界点的类请使用ChineseCalendar150A"""
START_YEAR = 1901
START_DATE = datetime.date(year=1901, month=2, day=19)
START_DATE_TIME = datetime.datetime(year=1901, month=2, day=19, hour=0, minute=0, second=0)
END_DATE = datetime.date(year=2050, month=12, day=31)
END_DATE_TIME = datetime.datetime(year=2050, month=12, day=31, hour=23, minute=59, second=59)
START_YEAR_GAN_ZHI = "辛丑"
START_YEAR_SHU_XIANG = 2 # 从1开始算起
START_MONTH_GAN_ZHI = "庚寅"
# 数组RUNYUE150_BIT存放阴历1901年到2050年闰月的月份,如没有则为0,每字节存两年
RUN_YUE_BIT = (
0x00, 0x50, 0x04, 0x00, 0x20, # 1910
0x60, 0x05, 0x00, 0x20, 0x70, # 1920
0x05, 0x00, 0x40, 0x02, 0x06, # 1930
0x00, 0x50, 0x03, 0x07, 0x00, # 1940
0x60, 0x04, 0x00, 0x20, 0x70, # 1950
0x05, 0x00, 0x30, 0x80, 0x06, #1960
0x00, 0x40, 0x03, 0x07, 0x00, #1970
0x50, 0x04, 0x08, 0x00, 0x60, #1980
0x04, 0x0a, 0x00, 0x60, 0x05, #1990
0x00, 0x30, 0x80, 0x05, 0x00, #2000
0x40, 0x02, 0x07, 0x00, 0x50, #2010
0x04, 0x09, 0x00, 0x60, 0x04, #2020
0x00, 0x20, 0x60, 0x05, 0x00, #2030
0x30, 0xb0, 0x06, 0x00, 0x50, #2040
0x02, 0x07, 0x00, 0x50, 0x03 # 2050
)
# 根据数组RUNYUE150_BIT导出的1901年到2050年闰月的月份字典
RUN_YUE = {
1901: 0, 1902: 0, 1903: 5, 1904: 0, 1905: 0, 1906: 4, 1907: 0, 1908: 0, 1909: 2, 1910: 0,
1911: 6, 1912: 0, 1913: 0, 1914: 5, 1915: 0, 1916: 0, 1917: 2, 1918: 0, 1919: 7, 1920: 0,
1921: 0, 1922: 5, 1923: 0, 1924: 0, 1925: 4, 1926: 0, 1927: 0, 1928: 2, 1929: 0, 1930: 6,
1931: 0, 1932: 0, 1933: 5, 1934: 0, 1935: 0, 1936: 3, 1937: 0, 1938: 7, 1939: 0, 1940: 0,
1941: 6, 1942: 0, 1943: 0, 1944: 4, 1945: 0, 1946: 0, 1947: 2, 1948: 0, 1949: 7, 1950: 0,
1951: 0, 1952: 5, 1953: 0, 1954: 0, 1955: 3, 1956: 0, 1957: 8, 1958: 0, 1959: 0, 1960: 6,
1961: 0, 1962: 0, 1963: 4, 1964: 0, 1965: 0, 1966: 3, 1967: 0, 1968: 7, 1969: 0, 1970: 0,
1971: 5, 1972: 0, 1973: 0, 1974: 4, 1975: 0, 1976: 8, 1977: 0, 1978: 0, 1979: 6, 1980: 0,
1981: 0, 1982: 4, 1983: 0, 1984: 10, 1985: 0, 1986: 0, 1987: 6, 1988: 0, 1989: 0, 1990: 5,
1991: 0, 1992: 0, 1993: 3, 1994: 0, 1995: 8, 1996: 0, 1997: 0, 1998: 5, 1999: 0, 2000: 0,
2001: 4, 2002: 0, 2003: 0, 2004: 2, 2005: 0, 2006: 7, 2007: 0, 2008: 0, 2009: 5, 2010: 0,
2011: 0, 2012: 4, 2013: 0, 2014: 9, 2015: 0, 2016: 0, 2017: 6, 2018: 0, 2019: 0, 2020: 4,
2021: 0, 2022: 0, 2023: 2, 2024: 0, 2025: 6, 2026: 0, 2027: 0, 2028: 5, 2029: 0, 2030: 0,
2031: 3, 2032: 0, 2033: 11, 2034: 0, 2035: 0, 2036: 6, 2037: 0, 2038: 0, 2039: 5, 2040: 0,
2041: 0, 2042: 2, 2043: 0, 2044: 7, 2045: 0, 2046: 0, 2047: 5, 2048: 0, 2049: 0, 2050: 3
}
# 数组MONTH_DAY_BIT存入阴历1901年到2050年每年中的月天数信息,
# 阴历每月只能是29或30天,一年用12(或13)个二进制位表示,对应位为1表30天,否则为29天
MONTH_DAY_BIT = (
0x4ae0, 0xa570, 0x5268, 0xd260, 0xd950, 0x6aa8, 0x56a0, 0x9ad0, 0x4ae8, 0x4ae0, # 1910
0xa4d8, 0xa4d0, 0xd250, 0xd548, 0xb550, 0x56a0, 0x96d0, 0x95b0, 0x49b8, 0x49b0, # 1920
0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada8, 0x2b60, 0x9570, 0x4978, 0x4970, 0x64b0, #1930
0xd4a0, 0xea50, 0x6d48, 0x5ad0, 0x2b60, 0x9370, 0x92e0, 0xc968, 0xc950, 0xd4a0, #1940
0xda50, 0xb550, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, 0xb4a8, 0x6ca0, #1950
0xb550, 0x55a8, 0x4da0, 0xa5b0, 0x52b8, 0x52b0, 0xa950, 0xe950, 0x6aa0, 0xad50, #1960
0xab50, 0x4b60, 0xa570, 0xa570, 0x5260, 0xe930, 0xd950, 0x5aa8, 0x56a0, 0x96d0, #1970
0x4ae8, 0x4ad0, 0xa4d0, 0xd268, 0xd250, 0xd528, 0xb540, 0xb6a0, 0x96d0, 0x95b0, #1980
0x49b0, 0xa4b8, 0xa4b0, 0xb258, 0x6a50, 0x6d40, 0xada0, 0xab60, 0x9570, 0x4978, #1990
0x4970, 0x64b0, 0x6a50, 0xea50, 0x6b28, 0x5ac0, 0xab60, 0x9368, 0x92e0, 0xc960, #2000
0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, #2010
0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8, #2020
0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0, #2030
0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0, #2040
0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0, # 2050
)
# MONTH_DAY_BIT导出的直观形式
MONTH_DAY = {
1901: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0],
1902: [30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0],
1903: [29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30],
1904: [30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0],
1905: [30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0],
1906: [29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30],
1907: [29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0],
1908: [30, 29, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0],
1909: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30],
1910: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0],
1911: [30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30],
1912: [30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0],
1913: [30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0],
1914: [30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30],
1915: [30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0],
1916: [29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0],
1917: [30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29],
1918: [30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0],
1919: [29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30],
1920: [29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0],
1921: [30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0],
1922: [30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30],
1923: [29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0],
1924: [29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0],
1925: [30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30],
1926: [29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0],
1927: [30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 0],
1928: [29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30],
1929: [29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0],
1930: [29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29],
1931: [30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0],
1932: [30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0],
1933: [29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30],
1934: [29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0],
1935: [29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0],
1936: [30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 29],
1937: [30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0],
1938: [30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30],
1939: [30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0],
1940: [30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0],
1941: [30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29],
1942: [30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0],
1943: [29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0],
1944: [30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30],
1945: [29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0],
1946: [30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0],
1947: [30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30],
1948: [30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0],
1949: [30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30],
1950: [29, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 0],
1951: [30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0],
1952: [29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30],
1953: [29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 29, 0],
1954: [30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0],
1955: [29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30],
1956: [29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0],
1957: [30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29],
1958: [30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0],
1959: [29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 0],
1960: [30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29],
1961: [30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 0],
1962: [29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0],
1963: [30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29],
1964: [30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0],
1965: [29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0],
1966: [30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29],
1967: [30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0],
1968: [29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30],
1969: [29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0],
1970: [30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0],
1971: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30],
1972: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 0],
1973: [30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0],
1974: [30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30],
1975: [30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0],
1976: [30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30],
1977: [30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 0],
1978: [30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0],
1979: [30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29],
1980: [30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0],
1981: [29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0],
1982: [30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30],
1983: [30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0],
1984: [30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30],
1985: [29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0],
1986: [29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0],
1987: [30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29],
1988: [30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0],
1989: [30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 0],
1990: [29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30],
1991: [29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0],
1992: [29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0],
1993: [29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29],
1994: [30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0],
1995: [29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 30, 29, 30],
1996: [29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 0],
1997: [30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0],
1998: [30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30],
1999: [30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0],
2000: [30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 0],
2001: [30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30],
2002: [30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0],
2003: [30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 0],
2004: [29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30],
2005: [29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0],
2006: [30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30],
2007: [29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0],
2008: [30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0],
2009: [30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30],
2010: [30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0],
2011: [30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0],
2012: [30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29],
2013: [30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0],
2014: [29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30],
2015: [29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 29, 0],
2016: [30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0],
2017: [29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30],
2018: [29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0],
2019: [30, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 0],
2020: [29, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30],
2021: [29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 0],
2022: [30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 0],
2023: [29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30],
2024: [29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0],
2025: [30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 29],
2026: [30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 30, 29, 0],
2027: [30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0],
2028: [30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29],
2029: [30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 30, 0],
2030: [29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 0],
2031: [29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29],
2032: [30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0],
2033: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30],
2034: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 0],
2035: [30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0],
2036: [30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30],
2037: [30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0],
2038: [30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 0],
2039: [30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29],
2040: [30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 29, 0],
2041: [29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0],
2042: [29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30],
2043: [29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0],
2044: [30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30],
2045: [30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0],
2046: [30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0],
2047: [30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30],
2048: [29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 0],
2049: [30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 0],
2050: [29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29]}
# 每个农历年中的天数
YEAR_DAY = {
1901: 354, 1902: 355, 1903: 383, 1904: 354, 1905: 355, 1906: 384, 1907: 354, 1908: 355, 1909: 384, 1910: 354,
1911: 384, 1912: 354, 1913: 354, 1914: 384, 1915: 355, 1916: 354, 1917: 384, 1918: 355, 1919: 384, 1920: 354,
1921: 354, 1922: 384, 1923: 354, 1924: 354, 1925: 385, 1926: 354, 1927: 355, 1928: 384, 1929: 354, 1930: 383,
1931: 354, 1932: 355, 1933: 384, 1934: 355, 1935: 354, 1936: 384, 1937: 354, 1938: 384, 1939: 354, 1940: 354,
1941: 384, 1942: 355, 1943: 354, 1944: 385, 1945: 354, 1946: 354, 1947: 384, 1948: 354, 1949: 384, 1950: 354,
1951: 355, 1952: 384, 1953: 354, 1954: 355, 1955: 384, 1956: 354, 1957: 383, 1958: 355, 1959: 354, 1960: 384,
1961: 355, 1962: 354, 1963: 384, 1964: 355, 1965: 353, 1966: 384, 1967: 355, 1968: 384, 1969: 354, 1970: 355,
1971: 384, 1972: 354, 1973: 354, 1974: 384, 1975: 354, 1976: 384, 1977: 354, 1978: 355, 1979: 384, 1980: 355,
1981: 354, 1982: 384, 1983: 354, 1984: 384, 1985: 354, 1986: 354, 1987: 384, 1988: 355, 1989: 355, 1990: 384,
1991: 354, 1992: 354, 1993: 383, 1994: 355, 1995: 384, 1996: 354, 1997: 355, 1998: 384, 1999: 354, 2000: 354,
2001: 384, 2002: 354, 2003: 355, 2004: 384, 2005: 354, 2006: 385, 2007: 354, 2008: 354, 2009: 384, 2010: 354,
2011: 354, 2012: 384, 2013: 355, 2014: 384, 2015: 354, 2016: 355, 2017: 384, 2018: 354, 2019: 354, 2020: 384,
2021: 354, 2022: 355, 2023: 384, 2024: 354, 2025: 384, 2026: 354, 2027: 354, 2028: 384, 2029: 355, 2030: 354,
2031: 384, 2032: 355, 2033: 384, 2034: 354, 2035: 354, 2036: 384, 2037: 354, 2038: 354, 2039: 384, 2040: 355,
2041: 355, 2042: 384, 2043: 354, 2044: 384, 2045: 354, 2046: 354, 2047: 384, 2048: 354, 2049: 355, 2050: 384}
#每年之前所有年份天数总和
BEFORE_YEAR_DAY = {
1901: 0, 1902: 354, 1903: 709, 1904: 1092, 1905: 1446, 1906: 1801, 1907: 2185, 1908: 2539, 1909: 2894, 1910: 3278,
1911: 3632, 1912: 4016, 1913: 4370, 1914: 4724, 1915: 5108, 1916: 5463, 1917: 5817, 1918: 6201, 1919: 6556, 1920: 6940,
1921: 7294, 1922: 7648, 1923: 8032, 1924: 8386, 1925: 8740, 1926: 9125, 1927: 9479, 1928: 9834, 1929: 10218, 1930: 10572,
1931: 10955, 1932: 11309, 1933: 11664, 1934: 12048, 1935: 12403, 1936: 12757, 1937: 13141, 1938: 13495, 1939: 13879, 1940: 14233,
1941: 14587, 1942: 14971, 1943: 15326, 1944: 15680, 1945: 16065, 1946: 16419, 1947: 16773, 1948: 17157, 1949: 17511, 1950: 17895,
1951: 18249, 1952: 18604, 1953: 18988, 1954: 19342, 1955: 19697, 1956: 20081, 1957: 20435, 1958: 20818, 1959: 21173, 1960: 21527,
1961: 21911, 1962: 22266, 1963: 22620, 1964: 23004, 1965: 23359, 1966: 23712, 1967: 24096, 1968: 24451, 1969: 24835, 1970: 25189,
1971: 25544, 1972: 25928, 1973: 26282, 1974: 26636, 1975: 27020, 1976: 27374, 1977: 27758, 1978: 28112, 1979: 28467, 1980: 28851,
1981: 29206, 1982: 29560, 1983: 29944, 1984: 30298, 1985: 30682, 1986: 31036, 1987: 31390, 1988: 31774, 1989: 32129, 1990: 32484,
1991: 32868, 1992: 33222, 1993: 33576, 1994: 33959, 1995: 34314, 1996: 34698, 1997: 35052, 1998: 35407, 1999: 35791, 2000: 36145,
2001: 36499, 2002: 36883, 2003: 37237, 2004: 37592, 2005: 37976, 2006: 38330, 2007: 38715, 2008: 39069, 2009: 39423, 2010: 39807,
2011: 40161, 2012: 40515, 2013: 40899, 2014: 41254, 2015: 41638, 2016: 41992, 2017: 42347, 2018: 42731, 2019: 43085, 2020: 43439,
2021: 43823, 2022: 44177, 2023: 44532, 2024: 44916, 2025: 45270, 2026: 45654, 2027: 46008, 2028: 46362, 2029: 46746, 2030: 47101,
2031: 47455, 2032: 47839, 2033: 48194, 2034: 48578, 2035: 48932, 2036: 49286, 2037: 49670, 2038: 50024, 2039: 50378, 2040: 50762,
2041: 51117, 2042: 51472, 2043: 51856, 2044: 52210, 2045: 52594, 2046: 52948, 2047: 53302, 2048: 53686, 2049: 54040, 2050: 54395}
#每年正月初一是当年公立的第几天
YEAR_FIRST_DAY = {
1901: 50, 1902: 39, 1903: 29, 1904: 47, 1905: 35, 1906: 25, 1907: 44, 1908: 33, 1909: 22, 1910: 41,
1911: 30, 1912: 49, 1913: 37, 1914: 26, 1915: 45, 1916: 35, 1917: 23, 1918: 42, 1919: 32, 1920: 51,
1921: 39, 1922: 28, 1923: 47, 1924: 36, 1925: 24, 1926: 44, 1927: 33, 1928: 23, 1929: 41, 1930: 30,
1931: 48, 1932: 37, 1933: 26, 1934: 45, 1935: 35, 1936: 24, 1937: 42, 1938: 31, 1939: 50, 1940: 39,
1941: 27, 1942: 46, 1943: 36, 1944: 25, 1945: 44, 1946: 33, 1947: 22, 1948: 41, 1949: 29, 1950: 48,
1951: 37, 1952: 27, 1953: 45, 1954: 34, 1955: 24, 1956: 43, 1957: 31, 1958: 49, 1959: 39, 1960: 28,
1961: 46, 1962: 36, 1963: 25, 1964: 44, 1965: 33, 1966: 21, 1967: 40, 1968: 30, 1969: 48, 1970: 37,
1971: 27, 1972: 46, 1973: 34, 1974: 23, 1975: 42, 1976: 31, 1977: 49, 1978: 38, 1979: 28, 1980: 47,
1981: 36, 1982: 25, 1983: 44, 1984: 33, 1985: 51, 1986: 40, 1987: 29, 1988: 48, 1989: 37, 1990: 27,
1991: 46, 1992: 35, 1993: 23, 1994: 41, 1995: 31, 1996: 50, 1997: 38, 1998: 28, 1999: 47, 2000: 36,
2001: 24, 2002: 43, 2003: 32, 2004: 22, 2005: 40, 2006: 29, 2007: 49, 2008: 38, 2009: 26, 2010: 45,
2011: 34, 2012: 23, 2013: 41, 2014: 31, 2015: 50, 2016: 39, 2017: 28, 2018: 47, 2019: 36, 2020: 25,
2021: 43, 2022: 32, 2023: 22, 2024: 41, 2025: 29, 2026: 48, 2027: 37, 2028: 26, 2029: 44, 2030: 34,
2031: 23, 2032: 42, 2033: 31, 2034: 50, 2035: 39, 2036: 28, 2037: 46, 2038: 35, 2039: 24, 2040: 43,
2041: 32, 2042: 22, 2043: 41, 2044: 30, 2045: 48, 2046: 37, 2047: 26, 2048: 45, 2049: 33, 2050: 23}
#数组JIE_QI_BIT存放每年的二十四节气对应的阳历日期
#每年的二十四节气对应的阳历日期几乎固定,平均分布于十二个月中
# 1月 2月 3月 4月 5月 6月
#小寒 大寒 立春 雨水 惊蛰 春分 清明 谷雨 立夏 小满 芒种 夏至
# 7月 8月 9月 10月 11月 12月
#小暑 大暑 立秋 处暑 白露 秋分 寒露 霜降 立冬 小雪 大雪 冬至
#*********************************************************************************
# 节气无任何确定规律,所以只好存表,要节省空间,所以....
# 下面这种存法实在是太变态了,你就将就着看吧
#*********************************************************************************/
#数据格式说明:
#如1901年的节气为
# 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
# 6, 21, 4, 19, 6, 21, 5, 21, 6,22, 6,22, 8, 23, 8, 24, 8, 24, 8, 24, 8, 23, 8, 22
# 9, 6, 11,4, 9, 6, 10,6, 9,7, 9,7, 7, 8, 7, 9, 7, 9, 7, 9, 7, 8, 7, 15
#上面第一行数据为每月节气对应日期,15减去每月第一个节气,每月第二个节气减去15得第二行
# 这样每月两个节气对应数据都小于16,每月用一个字节存放,高位存放第一个节气数据,低位存放
#第二个节气的数据,可得下表
JIE_QI_BIT = (
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1901
0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1902
0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, #1903
0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, #1904
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1905
0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1906
0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, #1907
0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1908
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1909
0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1910
0X96, 0XA5, 0X87, 0X96, 0X87, 0X87, 0X79, 0X69, 0X69, 0X69, 0X78, 0X78, #1911
0X86, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1912
0X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1913
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1914
0X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, #1915
0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1916
0X95, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, #1917
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77, #1918
0X96, 0XA5, 0X97, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, #1919
0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1920
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, #1921
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X77, #1922
0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X69, 0X69, 0X78, 0X78, #1923
0X96, 0XA5, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1924
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X87, #1925
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1926
0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1927
0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1928
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1929
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1930
0X96, 0XA4, 0X96, 0X96, 0X97, 0X87, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1931
0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1932
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1933
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1934
0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1935
0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1936
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1937
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1938
0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1939
0X96, 0XA5, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1940
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1941
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1942
0X96, 0XA4, 0X96, 0X96, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1943
0X96, 0XA5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1944
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1945
0X95, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, #1946
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1947
0X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #1948
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X79, 0X77, 0X87, #1949
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, #1950
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X79, 0X79, 0X79, 0X69, 0X78, 0X78, #1951
0X96, 0XA5, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #1952
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1953
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X68, 0X78, 0X87, #1954
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1955
0X96, 0XA5, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #1956
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1957
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1958
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1959
0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1960
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1961
0X96, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1962
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1963
0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1964
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1965
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1966
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1967
0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1968
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1969
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1970
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X79, 0X69, 0X78, 0X77, #1971
0X96, 0XA4, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1972
0XA5, 0XB5, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1973
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1974
0X96, 0XB4, 0X96, 0XA6, 0X97, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, #1975
0X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X89, 0X88, 0X78, 0X87, 0X87, #1976
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #1977
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, #1978
0X96, 0XB4, 0X96, 0XA6, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, #1979
0X96, 0XA4, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1980
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X77, 0X87, #1981
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1982
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X78, 0X79, 0X78, 0X69, 0X78, 0X77, #1983
0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, #1984
0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #1985
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1986
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X79, 0X78, 0X69, 0X78, 0X87, #1987
0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #1988
0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1989
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #1990
0X95, 0XB4, 0X96, 0XA5, 0X86, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1991
0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #1992
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1993
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1994
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X76, 0X78, 0X69, 0X78, 0X87, #1995
0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #1996
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #1997
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #1998
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #1999
0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #2000
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2001
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #2002
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #2003
0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #2004
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2005
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2006
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, #2007
0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, #2008
0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2009
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2010
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, #2011
0X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, #2012
0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, #2013
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2014
0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #2015
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, #2016
0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, #2017
0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2018
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #2019
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, #2020
0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #2021
0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2022
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, #2023
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, #2024
0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #2025
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2026
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #2027
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, #2028
0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #2029
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2030
0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, #2031
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, #2032
0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, #2033
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X78, 0X88, 0X78, 0X87, 0X87, #2034
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2035
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, #2036
0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, #2037
0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2038
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2039
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, #2040
0XA5, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, #2041
0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, #2042
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2043
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X87, 0X96, #2044
0XA5, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, #2045
0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, #2046
0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, #2047
0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96, #2048
0XA4, 0XC3, 0XA5, 0XA5, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, #2049
0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X78, 0X78, 0X87, 0X87 #2050
)
#JIE_QI_BIT的直观形式
JIE_QI = {
1901: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1902: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 7, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1903: (6, 21, 5, 20, 7, 22, 6, 21, 7, 22, 7, 22, 8, 24, 9, 24, 9, 24, 9, 24, 8, 23, 8, 23),
1904: (7, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 23, 7, 22),
1905: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1906: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1907: (6, 21, 5, 20, 7, 22, 6, 21, 7, 22, 7, 22, 8, 24, 9, 24, 9, 24, 9, 24, 8, 23, 8, 23),
1908: (7, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1909: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1910: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1911: (6, 21, 5, 20, 7, 22, 6, 21, 7, 22, 7, 22, 8, 24, 9, 24, 9, 24, 9, 24, 8, 23, 8, 23),
1912: (7, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1913: (6, 20, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1914: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1915: (6, 21, 5, 20, 6, 22, 6, 21, 6, 22, 7, 22, 8, 24, 8, 24, 9, 24, 9, 24, 8, 23, 8, 23),
1916: (6, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1917: (6, 20, 4, 19, 6, 21, 5, 21, 6, 21, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 7, 22),
1918: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1919: (6, 21, 5, 20, 6, 22, 6, 21, 6, 22, 7, 22, 8, 24, 8, 24, 9, 24, 9, 24, 8, 23, 8, 23),
1920: (6, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1921: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 7, 22),
1922: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1923: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 7, 22, 8, 24, 8, 24, 9, 24, 9, 24, 8, 23, 8, 23),
1924: (6, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1925: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 7, 22),
1926: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1927: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 7, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1928: (6, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1929: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1930: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1931: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 7, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1932: (6, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1933: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1934: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1935: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1936: (6, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1937: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1938: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1939: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1940: (6, 21, 5, 20, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1941: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1942: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1943: (6, 21, 5, 19, 6, 21, 6, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1944: (6, 21, 5, 20, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1945: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1946: (6, 20, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 8, 22),
1947: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1948: (6, 21, 5, 20, 5, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1949: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 24, 8, 23, 8, 24, 8, 22, 7, 22),
1950: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 8, 22),
1951: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 24, 8, 24, 8, 24, 9, 24, 8, 23, 8, 23),
1952: (6, 21, 5, 20, 5, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1953: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1954: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 8, 23, 8, 24, 8, 23, 9, 23, 8, 23, 7, 22),
1955: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1956: (6, 21, 5, 20, 5, 20, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1957: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1958: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1959: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1960: (6, 21, 5, 19, 5, 20, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1961: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1962: (6, 21, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1963: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1964: (6, 21, 5, 19, 5, 20, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1965: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1966: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1967: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1968: (6, 21, 5, 19, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1969: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1970: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1971: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 24, 9, 24, 8, 23, 8, 22),
1972: (6, 21, 5, 19, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1973: (5, 20, 4, 20, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1974: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1975: (6, 21, 4, 19, 6, 21, 5, 21, 6, 22, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 8, 22),
1976: (6, 21, 5, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 23, 7, 24, 7, 23, 8, 23, 7, 22, 7, 22),
1977: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1978: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 23, 7, 22),
1979: (6, 21, 4, 19, 6, 21, 5, 21, 6, 21, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 8, 22),
1980: (6, 21, 5, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1981: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 8, 22, 7, 22),
1982: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1983: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 8, 23, 8, 24, 8, 23, 9, 24, 8, 23, 8, 22),
1984: (6, 21, 4, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1985: (5, 20, 4, 19, 5, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1986: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1987: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 24, 8, 23, 9, 24, 8, 23, 7, 22),
1988: (6, 21, 4, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
1989: (5, 20, 4, 19, 5, 20, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1990: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
1991: (6, 20, 4, 19, 6, 21, 5, 20, 7, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
1992: (6, 21, 4, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
1993: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1994: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1995: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 21, 8, 23, 9, 24, 8, 23, 7, 22),
1996: (6, 21, 4, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
1997: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
1998: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
1999: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
2000: (6, 21, 4, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
2001: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2002: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2003: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
2004: (6, 21, 4, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
2005: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2006: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2007: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 9, 24, 8, 23, 7, 22),
2008: (6, 21, 4, 19, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 22, 8, 23, 7, 22, 7, 21),
2009: (5, 20, 4, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2010: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2011: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 23, 7, 22),
2012: (6, 21, 4, 19, 5, 20, 4, 20, 5, 20, 5, 21, 7, 22, 7, 23, 7, 22, 8, 23, 7, 22, 7, 21),
2013: (5, 20, 4, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2014: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2015: (6, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 22, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
2016: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 7, 22, 7, 23, 7, 22, 8, 23, 7, 22, 7, 21),
2017: (5, 20, 3, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2018: (5, 20, 4, 19, 5, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2019: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
2020: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 8, 23, 7, 22, 7, 21),
2021: (5, 20, 3, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
2022: (5, 20, 4, 19, 5, 20, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2023: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 24, 8, 22, 7, 22),
2024: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 8, 23, 7, 22, 6, 21),
2025: (5, 20, 3, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
2026: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2027: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2028: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 8, 23, 7, 22, 6, 21),
2029: (5, 20, 3, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
2030: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2031: (5, 20, 4, 19, 6, 21, 5, 20, 6, 21, 6, 21, 7, 23, 8, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2032: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 8, 23, 7, 22, 6, 21),
2033: (5, 20, 3, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
2034: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 8, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2035: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2036: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 8, 23, 7, 22, 6, 21),
2037: (5, 20, 3, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 21),
2038: (5, 20, 4, 18, 5, 20, 5, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2039: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2040: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 8, 23, 7, 22, 6, 21),
2041: (5, 20, 3, 18, 5, 20, 4, 20, 5, 20, 5, 21, 7, 22, 7, 23, 7, 22, 8, 23, 7, 22, 7, 21),
2042: (5, 20, 4, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 23, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2043: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2044: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 7, 23, 7, 22, 6, 21),
2045: (5, 20, 3, 18, 5, 20, 4, 19, 5, 20, 5, 21, 7, 22, 7, 23, 7, 22, 8, 23, 7, 22, 7, 21),
2046: (5, 20, 4, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 7, 23, 8, 23, 7, 22, 7, 22),
2047: (5, 20, 4, 19, 6, 21, 5, 20, 5, 21, 6, 21, 7, 23, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22),
2048: (6, 20, 4, 19, 5, 20, 4, 19, 5, 20, 5, 20, 6, 22, 7, 22, 7, 22, 7, 23, 7, 21, 6, 21),
2049: (5, 19, 3, 18, 5, 20, 5, 20, 5, 20, 5, 21, 6, 22, 7, 22, 7, 22, 8, 23, 7, 22, 7, 21),
2050: (5, 20, 3, 18, 5, 20, 4, 20, 5, 21, 5, 21, 7, 22, 7, 23, 8, 23, 8, 23, 7, 22, 7, 22)}
def __init__(self, arg=None):
self.gonglidatetime = None
self.gonglidate = None
if isinstance(arg, datetime.datetime):
if arg >= self.START_DATE_TIME and arg <= self.END_DATE_TIME:
self.gonglidatetime = arg
self.gonglidate = self.gonglidatetime.date()
self.InitData()
def InitData(self):
self.chineseyearnum = self.__GetChineseYearNum()
self.yearganzhinum = self.__GetYearGanzhiNum()
self.yearganzhi = self.__GetYearGanzhi()
self.yearshuxiangnum = self.__GetYearShuxiangNum()
self.chinesedate = self.__GetChineseDate()
self.monthganzhinum = self.__GetMonthGanzhiNum()
self.monthganzhi = self.__GetMonthGanzhi()
self.dayganzhinum = self.__GetDayGanzhiNum()
self.dayganzhi = self.__GetDayGanzhi()
# self.hourganzhinum=self.__GetHourGanzhiNum()
self.hourganzhi = self.__GetHourGanzhi()
# self.jieqinum=self.__GetJieQiNum()
self.jieqi = self.__GetJieQi()
##################################################
def __GetChineseYearNum(self, arg=None):
"""将公立日期转换为农历年份"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return 0
if arg < self.START_DATE or arg > self.END_DATE:
return 0
lastyear1231 = datetime.date(arg.year - 1, month=12, day=31)
delta = arg - lastyear1231
year = 1901
if delta.days >= self.YEAR_FIRST_DAY[arg.year]:
year = arg.year
else:
year = arg.year - 1
return year
def GetChineseYearNum(self, arg=None):
if arg == None:
return self.chineseyearnum
else:
return self.__GetChineseYearNum(arg)
##################################################
def __GetYearGanzhiNum(self, arg=None):
"""获取干支年序号[1,60]"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return 0
if arg < self.START_DATE or arg > self.END_DATE:
return 0
year = self.GetChineseYearNum(arg)
num = ((year - self.START_DATE.year) + Ganzhi2Num(self.START_YEAR_GAN_ZHI)) % 60
if num == 0:
num = 60
return num
def GetYearGanzhiNum(self, arg=None):
if arg == None:
return self.yearganzhinum
else:
return self.__GetYearGanzhiNum(arg)
##################################################
def __GetYearGanzhi(self, arg=None):
"""获取年干支"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return ""
if arg < self.START_DATE or arg > self.END_DATE:
return ""
return Num2Ganzhi(self.GetYearGanzhiNum(arg))
def GetYearGanzhi(self, arg=None):
if arg == None:
return self.yearganzhi
else:
return self.__GetYearGanzhi(arg)
##################################################
def __GetYearShuxiangNum(self, arg=None):
"""获取属相序号[1,12]"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return 0
if arg < self.START_DATE or arg > self.END_DATE:
return 0
yearnum = self.GetChineseYearNum(arg)
shuxiangnum = (yearnum - self.START_YEAR + self.START_YEAR_SHU_XIANG) % 12
if shuxiangnum == 0:
shuxiangnum = 12
return shuxiangnum
def GetYearShuxiangNum(self, arg=None):
if arg == None:
return self.yearshuxiangnum
else:
return self.__GetYearShuxiangNum(arg)
##################################################
def __GetChineseDate(self, arg=None):
"""获取某日期的农历日期,返回(是否大月,是否闰月,月份,日子)"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return 0
if arg < self.START_DATE or arg > self.END_DATE:
return 0
dayue = {30: True, 29: False}
yearnum = self.GetChineseYearNum(arg)
delta = datetime.timedelta(days=self.YEAR_FIRST_DAY[yearnum] - 1)
gongliyuandan = datetime.date(year=yearnum, month=1, day=1)
gonglichiyi = gongliyuandan + delta
delta = arg - gonglichiyi
days = delta.days + 1
month = []
if self.RUN_YUE[yearnum] > 0:
for i in range(13):
if i + 1 <= self.RUN_YUE[yearnum]:
month.append([False, i + 1, self.MONTH_DAY[yearnum][i]])
elif i == self.RUN_YUE[yearnum]:
month.append([True, i, self.MONTH_DAY[yearnum][i]])
else:
month.append([False, i, self.MONTH_DAY[yearnum][i]])
pass
else:
for i in range(12):
month.append([False, i + 1, self.MONTH_DAY[yearnum][i]])
for i in range(len(month)):
days -= month[i][2]
if days <= 0:
return (dayue[month[i][2]], month[i][0], month[i][1], days + month[i][2])
def GetChineseDate(self, arg=None):
if arg == None:
return self.chinesedate
else:
return self.__GetChineseDate(arg)
##################################################
def __GetMonthGanzhiNum(self, arg=None):
"""获取某日期的月干支序号,[1,60]"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return ""
if arg < self.START_DATE or arg > self.END_DATE:
return ""
chineseyear = self.GetChineseYearNum(arg)
chinesedate = self.GetChineseDate(arg)
startchinesedate = self.GetChineseDate(self.START_DATE)
years = chineseyear - self.START_YEAR
months = years * 12 + chinesedate[2] - startchinesedate[2]
ganzhinum = months + Ganzhi2Num(self.START_MONTH_GAN_ZHI)
ganzhinum = ganzhinum % 60
if ganzhinum == 0:
ganzhinum = 60
return ganzhinum
def GetMonthGanzhiNum(self, arg=None):
"""获取某日期的月干支序号,[1,60]"""
if arg == None:
return self.monthganzhinum
else:
return self.__GetMonthGanzhiNum(arg)
##################################################
def __GetMonthGanzhi(self, arg=None):
"""获取月干支"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return ""
if arg < self.START_DATE or arg > self.END_DATE:
return ""
return Num2Ganzhi(self.GetMonthGanzhiNum(arg))
def GetMonthGanzhi(self, arg=None):
"""获取月干支"""
if arg == None:
return self.monthganzhi
else:
return self.__GetMonthGanzhi(arg)
##################################################
def __GetDayGanzhiNum(self, arg=None):
"""获取日干支序号,[1,60]"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return 0
if arg < self.START_DATE or arg > self.END_DATE:
return 0
return GetDayGanzhiNum1901(arg)
def GetDayGanzhiNum(self, arg=None):
"""获取日干支序号,[1,60]"""
if arg == None:
return self.dayganzhinum
else:
return self.__GetDayGanzhiNum(arg)
##################################################
def __GetDayGanzhi(self, arg=None):
"""获取日干支"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return ""
if arg < self.START_DATE or arg > self.END_DATE:
return ""
return GetDayGanzhi(arg)
def GetDayGanzhi(self, arg=None):
"""获取日干支"""
if arg == None:
return self.dayganzhi
else:
return self.__GetDayGanzhi(arg)
##################################################
def __GetHourGanzhi(self, arg=None):
"""获取小时干支"""
if arg == None:
arg = self.gonglidatetime
if not isinstance(arg, datetime.datetime):
return ""
if arg < self.START_DATE_TIME or arg > self.END_DATE_TIME:
return ""
return GetHourGanzhi1901(arg)
def GetHourGanzhi(self, arg=None):
"""获取小时干支"""
if arg == None:
return self.hourganzhi
else:
return self.__GetHourGanzhi(arg)
##################################################
def __GetJieQi(self, arg=None):
"""获取节气"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return ""
if arg < self.START_DATE or arg > self.END_DATE:
return ""
year = self.JIE_QI[arg.year]
if year[(arg.month - 1) * 2] == arg.day:
return JIE_QI_NAME[(arg.month - 1) * 2]
elif year[(arg.month - 1) * 2 + 1] == arg.day:
return JIE_QI_NAME[(arg.month - 1) * 2 + 1]
return ""
def GetJieQi(self, arg=None):
"""获取节气"""
if arg == None:
return self.jieqi
else:
return self.__GetJieQi(arg)
######################格式打印############################
def GetFullGanzhiDate1(self):
"""形如 闰九月大 廿六日"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
monthchinese = ZH_MONTH[self.chinesedate[2]]
runyue = " "
if self.chinesedate[1]:
runyue = "闰"
dayue = "小"
if self.chinesedate[0]:
dayue = "大"
return "%s%s%s %s日" % (runyue, monthchinese, dayue, ZH_DAY[self.chinesedate[3]])
def GetFullGanzhiDate2(self):
"""形如 己丑年 闰九月大 廿六日"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s年 %s" % (self.yearganzhi, self.GetFullGanzhiDate1())
def GetFullGanzhiDate3(self):
"""形如 甲戌月 辛酉日"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s月 %s日" % (self.monthganzhi, self.dayganzhi)
def GetFullGanzhiDate4(self):
"""形如 己丑年 甲戌月 辛酉日"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s年 %s" % (self.yearganzhi, self.GetFullGanzhiDate3())
def GetFullGanzhiDate5(self):
"""形如 己丑年 甲戌月 辛酉日 冬至"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s %s" % (self.GetFullGanzhiDate4(), self.GetJieQi())
def GetFullGanzhiTime1(self):
"""形如 闰九月大 廿六日 戊戌初"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
runyue = " "
if self.chinesedate[1]:
runyue = "闰"
dayue = "小"
if self.chinesedate[0]:
dayue = "大"
return "%s%s%s %s日 %s" % (
runyue, ZH_MONTH[self.chinesedate[2]], dayue, ZH_DAY[self.chinesedate[3]], self.hourganzhi)
def GetFullGanzhiTime2(self):
"""形如 己丑年 闰九月大 廿六日 戊戌初"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s年 %s" % (self.yearganzhi, self.GetFullGanzhiTime1())
def GetFullGanzhiTime3(self):
"""形如 甲戌月 辛酉日 己亥初"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s月 %s日 %s" % (self.monthganzhi, self.dayganzhi, self.hourganzhi)
def GetFullGanzhiTime4(self):
"""形如 己丑年 甲戌月 辛酉日 己亥初"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s年 %s" % (self.yearganzhi, self.GetFullGanzhiTime3())
def GetFullGanzhiTime5(self):
"""形如 己丑年 甲戌月 辛酉日 己亥初 冬至"""
if self.gonglidatetime == None or self.gonglidate == None:
return ""
return "%s %s" % (self.GetFullGanzhiTime4(), self.GetJieQi())
####################ChineseCalendar150定义结束####################
####################ChineseCalendar150A定义开始####################
class ChineseCalendar150A(ChineseCalendar150):
"""ChineseCalendar150的子类,实现24节气作为年干支与月干支的分界"""
def InitData(self):
ChineseCalendar150.InitData(self)
self.chineseyearnumA = self.__GetChineseYearNumA()
def __GetChineseYearNumA(self, arg=None):
"""将公立日期转换为农历年份,以立春为界"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return 0
if arg < self.START_DATE or arg > self.END_DATE:
return 0
lastyear1231 = datetime.date(arg.year - 1, month=12, day=31)
delta = arg - lastyear1231
year = 1901
if delta.days >= self.JIE_QI[arg.year][2] + 31:
year = arg.year
else:
year = arg.year - 1
return year
def GetChineseYearNumA(self, arg=None):
if arg == None:
return self.chineseyearnumA
else:
return self.__GetChineseYearNumA(arg)
def __GetYearGanzhiNum(self, arg=None):
"""获取某日期的干支年数字[1,60],立春为界"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return 0
if arg < self.START_DATE or arg > self.END_DATE:
return 0
year = self.GetChineseYearNumA(arg)
num = ((year - self.START_DATE.year) + Ganzhi2Num(self.START_YEAR_GAN_ZHI)) % 60
if num == 0:
num = 60
return num
def GetYearGanzhiNum(self, arg=None):
if arg == None:
return self.yearganzhinum
else:
return self.__GetYearGanzhiNum(arg)
def __GetMonthGanzhiNum(self, arg=None):
"""获取某日期的月干支序号,[1,60],24节气为界"""
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return ""
if arg < self.START_DATE or arg > self.END_DATE:
return ""
chineseyear = self.GetChineseYearNumA(arg)
a = self.JIE_QI[arg.year][(arg.month - 1) * 2]
if arg.day < a:
thismonth = arg.month - 2
else:
thismonth = arg.month - 1
if thismonth == -1:
thismonth = 11
elif thismonth == 0:
thismonth = 12
years = chineseyear - self.START_YEAR
months = years * 12 + thismonth - 1
ganzhinum = months + Ganzhi2Num(self.START_MONTH_GAN_ZHI)
ganzhinum = ganzhinum % 60
if ganzhinum == 0:
ganzhinum = 60
return ganzhinum
def GetMonthGanzhiNum(self, arg=None):
"""获取某日期的月干支序号,[1,60],24节气为界"""
if arg == None:
return self.monthganzhinum
else:
return self.__GetMonthGanzhiNum(arg)
####################ChineseCalendar150A定义结束####################
def GetHourGanzhi2(hour=0):
if hour in range(25):
return HOUR_GANZHI_2[hour]
else:
return ""
def GetHourGanzhi1(hour=0):
if hour in range(25):
return HOUR_GANZHI_1[hour]
else:
return ""
def GetHourGanzhi1901(arg):
"""获取某时间的小时干支,以1901年1月1日1点为计算起点,数据来自《日梭万年历》 """
startdatetime = datetime.datetime(year=1901, month=1, day=1, hour=1)
startganzhi = 1
if not isinstance(arg, datetime.datetime):
return ""
delta = arg - startdatetime
if delta.seconds < 0:
return ""
hour = delta.days * 24 + delta.seconds / 3600
num = (startganzhi + hour / 2) % 10
return TIAN_GAN[num] + HOUR_GANZHI[arg.hour]
def GetHourGanzhi(arg):
return GetHourGanzhi1901(arg)
def Ganzhi2Num(arg):
"""将干支表示转换为序号,[1,60],出现错误返回0,参数arg必须为utf8格式"""
retult = 0
table = {0: 0, 10: 1, 8: 2, 6: 3, 4: 4, 2: 5}
uarg = unicode(arg, "utf8")
if len(uarg) != 2:
return 0
x = 0
y = 0
for x in range(10):
if uarg[0] == unicode(TIAN_GAN[x], "utf8"):
break
for y in range(12):
if uarg[1] == unicode(DI_ZHI[y], "utf8"):
break
y = (y + 12 - x) % 12
if y in table.keys():
return table[y] * 10 + x + 1
else:
return 0
def Num2Ganzhi(arg):
"""Ganzhi2Num的逆过程,arg范围是[1,60]"""
if not arg in range(1, 61):
return ""
x = (arg - 1) % 10
y = (arg - 1) % 12
return TIAN_GAN[x] + DI_ZHI[y]
def GetDayGanzhiNum1901(arg):
"""获取某天的干支日序号,最早1901年1月1日,返回值[1,60],
以1901年1月1日1点为计算起点,数据来自《日梭万年历》 """
if not isinstance(arg, datetime.date):
return 0
startdate = datetime.date(1901, 1, 1)
startganzhi = 16
if not isinstance(arg, datetime.date):
return 0
delta = arg - startdate
if delta.days + delta.seconds < 0:
return ""
num = (startganzhi + delta.days) % 60
if num == 0:
num = 60
return num
def GetDayGanzhi1901(arg):
"""获取某天的干支日,最早1901年1月1日,以1901年1月1日1点为计算起点,数据来自《日梭万年历》 """
return Num2Ganzhi(GetDayGanzhiNum1901(arg))
def GetDayGanzhi(arg):
return GetDayGanzhi1901(arg)
class ChineseCalendarError(Exception):
pass
class ChineseCalendar:
pass
class ZLCalendar(ChineseCalendar150A):
def InitData(self):
ChineseCalendar150A.InitData(self)
self.zlmoth = self.chineseyearnum
self.zlinit()
self.zlgan = XZ_Gan[self.zlngz % 10]
self.zlzhi = SHU_XIANG[self.zlngz % 12]
self.zldate = '{}{}年{}{}'.format(self.zlgan, self.zlzhi, self._zlyue,
"{chong}{day}日{que}".format(day=ZH_DAY[self.zlday], **self.que_chong))
self.zljieri = self.GetZLHoliday()
self.holiday = self.__GetHoliday()
self.jieri = self.__GetChineseHoliday()
def GetFullGanzhiDate6(self):
"""形如 甲午年十一月小廿五日 """
monthchinese = ZH_MONTH[self.chinesedate[2]]
runyue = "闰" if self.chinesedate[1] else ""
dayue = "大" if self.chinesedate[0] else "小"
return "%s年%s%s%s%s日%s" % (
self.yearganzhi, runyue, monthchinese, dayue, ZH_DAY[self.chinesedate[3]], self.GetJieQi())
def __GetChineseHoliday(self, arg=None):
""" 农历假日 """
if arg == None:
arg = self.chinesedate
if not len(arg) == 4:
return ""
key = "".join(map(lambda x: str(x) if x > 9 else "0%d" % x, arg[2:]))
r = HOLIDAY["LUNAR"].get(key, "")
if not isinstance(r, dict):
r = {"info": "", "name": r}
return r
def __GetHoliday(self, arg=None):
""" 公历假日 """
if arg == None:
arg = self.gonglidate
if not isinstance(arg, datetime.date):
return ""
if arg < self.START_DATE or arg > self.END_DATE:
return ""
r = HOLIDAY["SOLAR"].get(arg.strftime("%m%d"), "")
if not isinstance(r, dict):
r = {"info": "", "name": r}
return r
def GetHoliday(self, arg=None):
""" 公历假日 """
if arg == None:
return self.holiday
else:
return self.__GetHoliday(arg)
def GetChineseHoliday(self, arg=None):
""" 农历假日 """
if arg == None:
return self.jieri
else:
return self.__GetChineseHoliday(arg)
def GetZLHoliday(self):
""" 西藏假日 """
month, day = self.zlmoth, self.zlday
# if day in SHIZAIRI:
# return SHIZAIRI[day]
# if day == 1 and month != 1:
# return self._zlyue
key = "".join(map(lambda x: str(x) if x > 9 else "0%d" % x, (month, day)))
r = HOLIDAY['XIZANG'].get(key, "")
if not isinstance(r, dict):
r = {"info": "", "name": r}
return r
def _zlinit(self):
zl_year = self.chineseyearnum
zl_month, self.zlday = self.chinesedate[2:]
self._zlyue = ZH_DAY[zl_month]
self.que_chong = {'que': '', 'chong': ''}
self.zlngz = zl_year - 4
def zlinit(self):
""" 藏历初始化 原始方法来自一段神奇的js代码 """
chinese_year_num = self.chineseyearnum
self.zlraohuinum = ((chinese_year_num - 1027) - (chinese_year_num - 1027) % 60) / 60 + 1
if chinese_year_num not in XZ_BEGAIN_30 or chinese_year_num not in XZ_RCQ:
return self._zlinit()
zl_month = cm = self.chinesedate[2]
if zl_month >= self.RUN_YUE[chinese_year_num] and self.chinesedate[1]:
zl_month += 1
self.zlday = chineseday = self.chinesedate[3]
zl_year = chinese_year_num
if chinese_year_num == 0:
zl_year -= 1
zl_month += 12
# 不明白为什么2014年之前的数据ok,
# 可能方法不一样
if chinese_year_num >= 2015:
zl_month += 1
if chinese_year_num in XZ_BEGAIN_30 and cm in XZ_BEGAIN_30[chinese_year_num]:
if chineseday == 0:
self.zlday = 30
else:
self.zlday -= 1
# 各种黑魔法上演
if chinese_year_num == 2009:
if cm == 1:
zl_month = 13
zl_year -= 1
elif chinese_year_num == 2011:
if cm == 1:
zl_month = 12
elif chinese_year_num == 2013:
if cm == 11:
self.zlday = chineseday
elif chinese_year_num == 2014:
if cm == 1:
zl_month = 13
zl_year -= 1
if cm == 9 and not self.chinesedate[1]:
if chineseday == 0:
self.zlday = -1
else:
self.zlday -= 1
if cm == 11:
self.zlday = chineseday
if cm >= 10:
zl_month += 1
if zl_month > 1:
rcq_info = XZ_RCQ[zl_year][zl_month - 2]
else:
zl_year = zl_year - 1
rcq_info = XZ_RCQ[zl_year][zl_month - 2]
self.zlmoth = int(rcq_info[1:3])
if rcq_info[0] in ["Q", "C", "W"]:
self._zlyue = "闰" + XZ_MONTH[self.zlmoth]
else:
self._zlyue = XZ_MONTH[self.zlmoth]
self.que_chong = {'que': '', 'chong': ''}
if len(rcq_info) >= 5:
for row in map(lambda i: rcq_info[i: i + 5], range(0, len(rcq_info), 5)):
if row[0] in ['c', 'C']:
if int(row[3:]) == self.zlday - 1:
self.que_chong['chong'] = '重'
if int(row[3:]) < self.zlday:
self.zlday -= 1
if row[0] in ['q', 'Q']:
if int(row[3:]) == self.zlday + 1:
self.que_chong['que'] = '/缺' + ZH_DAY[self.zlday + 1] + '日'
if int(row[3:]) <= self.zlday:
self.zlday += 1
if chineseday < 2 and self.zlday in (0, 30):
zl_month -= 1
if zl_month > 1:
rcq_info = XZ_RCQ[zl_year][zl_month - 2]
else:
zl_year = zl_year - 1
rcq_info = XZ_RCQ[zl_year][zl_month - 2]
self.zlmoth = int(rcq_info[1:3])
if rcq_info[0] == "Q":
self._zlyue = "闰" + XZ_MONTH[self.zlmoth]
else:
self._zlyue = XZ_MONTH[self.zlmoth]
self.zlday = 30
self.zlngz = zl_year - 4
def benchmark(max=10000):
import time
nw = datetime.datetime.now()
no = 1
start = time.time()
while True:
delta = datetime.timedelta(days=no)
ZLCalendar(nw + delta)
if no * 10 % max == 0:
print no, (time.time() - start) / max * 1000 * 1000
if no == max:
break
no += 1
print (time.time() - start) / max * 1000 * 1000
def test():
for (day, r) in (
((2013, 8, 16), "水蛇年具醉月初十日"),
((2013, 10, 15), "水蛇年闰具贤月十一日/缺十二日"),
((2013, 11, 14), "水蛇年天降月十二日"),
((2014, 1, 13), "水蛇年庄严月十三日"),
((2014, 2, 12), "水蛇年满意月十三日"),
((2014, 3, 1), "水蛇年满意月三十日"),
((2014, 3, 14), "木马年神变月十三日"),
((2014, 5, 13), "木马年具香月十四日"),
((2014, 6, 12), "木马年萨嘎月十四日"),
((2014, 8, 11), "木马年明净月十六日"),
((2014, 11, 21), '木马年天降月廿九日'),
((2014, 11, 22), '木马年天降月三十日'),
((2014, 11, 23), '木马年持众月初一日'),
((2014, 12, 22), '木马年庄严月初一日'),
((2015, 3, 1), '木羊年神变月十一日'),
((2015, 3, 20), '木羊年神变月三十日'),
((2015, 4, 1), '木羊年苦行月十二日'),
((2015, 4, 18), '木羊年苦行月三十日'),
((2015, 4, 19), '木羊年具香月初一日'),
((2015, 5, 18), '木羊年具香月三十日'),
((2015, 5, 19), '木羊年萨嘎月初一日'),
((2015, 5, 25), '木羊年萨嘎月初七日'),
((2015, 6, 16), '木羊年萨嘎月三十日'),
((2015, 6, 17), '木羊年作净月初一日'),
((2015, 7, 6), '木羊年作净月二十日'),
((2015, 7, 15), '木羊年作净月廿九日'),
((2015, 7, 16), '木羊年作净月三十日'),
((2015, 7, 17), '木羊年明净月初一日'),
((2015, 7, 19), '木羊年明净月初三日'),
((2015, 7, 19), '木羊年明净月初三日'),
((2015, 8, 14), '木羊年明净月三十日'),
((2015, 8, 15), '木羊年具醉月初一日'),
((2015, 9, 3), '木羊年具醉月二十日'),
((2015, 9, 13), '木羊年具醉月三十日'),
((2015, 9, 14), '木羊年具贤月初一日'),
((2015, 10, 1), '木羊年具贤月十九日'),
((2015, 10, 12), '木羊年具贤月三十日'),
((2015, 10, 13), '木羊年天降月初一日'),
((2015, 11, 1), '木羊年天降月二十日'),
((2015, 11, 11), '木羊年天降月三十日'),
((2015, 11, 12), '木羊年持众月初一日'),
((2015, 12, 1), '木羊年持众月廿一日'),
((2015, 12, 9), '木羊年持众月廿八日'),
((2015, 12, 11), '木羊年持众月三十日'),
((2015, 12, 12), '木羊年庄严月初一日'),
((2015, 12, 12), '木羊年庄严月初一日'),
((2015, 12, 31), '木羊年庄严月廿一日'),
):
dt = datetime.datetime(*day)
zl = ZLCalendar(dt)
print zl.gonglidate, zl.zldate, zl.zlmoth , zl.zljieri['name']
if r: assert zl.zldate == r
nw = datetime.datetime(2015, 1, 1, 1, 1, 1, 619809)
old = -1
for no in range(450):
delta = datetime.timedelta(days=no)
dt = nw + delta
zl = ZLCalendar(dt)
assert old != zl.zldate
old = zl.zldate
if __name__ == "__main__":
test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment