|
# -*- 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() |