# cnlunar
<h2>项目优点</h2>
1、不使用寿星通式[Y*D+C]-L，而使用香港天文台数据（阴阳合历，节气准农历日期才能准）

2、无数据库，依赖库少，运行快速，提供内容丰富

3、主要内容来自于《钦定协纪辨方书》，每一个神煞宜忌都有依据，遵循宜忌等第表，包含民用、御用事宜，且支持港式（通书配图）八字月柱算法-默认，通书原文文字农历月份算法，具体看date2LunarData.py

4、不盈利，开源免费，长期有人维护

5、民俗社会科学项目，不搞封建迷信，宜忌意义在于民间是将红白事合理分开，避免今日您宴请宾客，邻居办白事情况出现，引起邻里纠纷社会分裂。

特别鸣谢@DarkmoonRabbit(https://github.com/DarkmoonRabbit)

相关产品：
翻黄历 https://www.fanhuangli.com/

万年历-最新专业桌面老黄‪历 https://apps.apple.com/cn/app/id1555822960
<h2>快速上手</h2>
```
$ pip3 install cnlunar
```

```
import cnlunar

# a = cnlunar.Lunar() # 为空为当前时间

a = cnlunar.Lunar(datetime.datetime(2019, 2, 4, 22, 30))
dic = {
    '日期': a.date,
    '农历数字': (a.lunarYear, a.lunarMonth, a.lunarDay, '闰' if a.isLunarLeapMonth else ''),
    '农历': '%s %s[%s]年 %s%s' % (a.lunarYearCn, a.year8Char, a.chineseYearZodiac, a.lunarMonthCn, a.lunarDayCn),
    '星期': a.weekDayCn,
    # 未增加除夕
    '今日节日': (a.get_legalHolidays(), a.get_otherHolidays(), a.get_otherLunarHolidays()),
    '八字': ' '.join([a.year8Char, a.month8Char, a.day8Char, a.twohour8Char]),
    '今日节气': a.todaySolarTerms,
    '下一节气': (a.nextSolarTerm, a.nextSolarTermDate, a.nextSolarTermYear),
    '今年节气表': a.thisYearSolarTermsDic,
    '季节': a.lunarSeason,
    '今日时辰': a.twohour8CharList,
    '时辰凶吉': a.get_twohourLuckyList(),
    '生肖冲煞': a.chineseZodiacClash,
    '星座': a.starZodiac,
    '星次': a.todayEastZodiac,
    '彭祖百忌': a.get_pengTaboo(),
    '彭祖百忌精简': a.get_pengTaboo(long=4, delimit='<br>'),
    '十二神': a.get_today12DayOfficer(),
    '廿八宿': a.get_the28Stars(),
    '今日三合': a.zodiacMark3List,
    '今日六合': a.zodiacMark6,
    '今日五行': a.get_today5Elements(),
    '纳音': a.get_nayin(),
    '九宫飞星': a.get_the9FlyStar(),
    '吉神方位': a.get_luckyGodsDirection(),
    '今日胎神': a.get_fetalGod(),
    '神煞宜忌': a.angelDemon,
    '今日吉神': a.goodGodName,
    '今日凶煞': a.badGodName,
    '宜': a.goodThing,
    '忌': a.badThing,
    '时辰经络': a.meridians
}
```

<h2>项目概述：</h2>
由于三体运动（主要地球、太阳、月球）无法准确预测，目前二十四节气依然还是靠天文台观测，Yovey使用传说中[Y*D+C]-L方法实际有很多天数不准，def getSolarTerms(_date)12个if嵌套判断让代码变得十分冗余，由简书网友“大咖_247c”首先发现计算不准问题……
【方案过程】
![image.png](https://upload-images.jianshu.io/upload_images/2369108-a121d5e561adc30b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

1、在校验过数据与公式差异后，第一方案是采用15%黄经夹角计算，计算后差异依然存在，地球椭圆形轨道一年内公转速度差异超过7%；
![开普勒.gif](https://upload-images.jianshu.io/upload_images/2369108-671532f9183aad1d.gif?imageMogr2/auto-orient/strip)

2、在发现椭圆轨道问题后，尝试使用平均值、开普勒第二定律计算行星轨道，计算值已经十分贴近了，但依然和香港天文台数据有差异，恍然大悟，地球、月亮、太阳三个天体呈现无法完美预测的三体运动，甚至还包括木星引力影响（比如传说中九星连珠，虽然引力抵消微弱），而且太阳本身也在运动，地球和太阳的质量也不是永恒不变的，这就导致地球的恒星年相对稳定，但回归年浮动振荡；
![image.png](https://upload-images.jianshu.io/upload_images/2369108-2cdf50bbe6b62989.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3、当试过所有技术物理原理还无法调节误差后，最终使用了Chen Jian的核心设计理念，添加了十六进制加存二十四节气。（还是要靠香港天文台）
coding=UTF-8
1901~2100年农历数据表
Author: cuba3
base code by Yovey , https://www.jianshu.com/p/8dc0d7ba2c2a
powered by Late Lee, http://www.latelee.org/python/python-yangli-to-nongli.html#comment-78
other author:Chen Jian, http://www.cnblogs.com/chjbbs/p/5704326.html
数据来源: http://data.weather.gov.hk/gts/time/conversion1_text_c.htm

[【GITHUB/cuba3】:pyLunarCalendar项目地址>>https://github.com/OPN48/pyLunarCalendar](https://github.com/OPN48/pyLunarCalendar])

跟进Chen Jian的设计思路，增加了一层向量压缩。
因为24节气每个月新历月固定有两个，所以list保持顺序，月份就不用存了，一定是1、1、2、2、3、3……
只记录日期的话，日期数据过大，所以对200年内4800个数据进行分组比对，求出最小公约数，得出最小公约年向量[4, 19, 3, 18, 4, 19, 4, 19, 4, 20, 4, 20, 6, 22, 6, 22, 6, 22, 7, 22, 6, 21, 6, 21]，将爬取数据减去这个最小公约向量，就得到了一个元素最大值不大于3的矩阵。
所有数字不大于3，两个二进制就可满足存储一个日期，一个十六进制就能存储一个月，利用Python3 位移算法 << 2 将原本庞大的txt文本压缩成长度200的12位16进制list。
```
# 1901-2100年二十节气最小公约数序列 向量压缩法
encryptionVectorList=[4, 19, 3, 18, 4, 19, 4, 19, 4, 20, 4, 20, 6, 22, 6, 22, 6, 22, 7, 22, 6, 21, 6, 21]

# 1901-2100年二十节气数据 每个元素的存储格式如下：
# 1-24
# 节气所在天（减去节气最小公约数）
# 1901-2100年香港天文台公布二十四节气按年存储16进制，1个16进制为4个2进制
solarTermsData=[
    0x6aaaa6aa9a5a, 0xaaaaaabaaa6a, 0xaaabbabbafaa, 0x5aa665a65aab, 0x6aaaa6aa9a5a, # 1901 ~ 1905
    0xaaaaaaaaaa6a, 0xaaabbabbafaa, 0x5aa665a65aab, 0x6aaaa6aa9a5a, 0xaaaaaaaaaa6a,
    0xaaabbabbafaa, 0x5aa665a65aab, 0x6aaaa6aa9a56, 0xaaaaaaaa9a5a, 0xaaabaabaaeaa,
    0x569665a65aaa, 0x5aa6a6a69a56, 0x6aaaaaaa9a5a, 0xaaabaabaaeaa, 0x569665a65aaa,
    0x5aa6a6a65a56, 0x6aaaaaaa9a5a, 0xaaabaabaaa6a, 0x569665a65aaa, 0x5aa6a6a65a56,
    0x6aaaa6aa9a5a, 0xaaaaaabaaa6a, 0x555665665aaa, 0x5aa665a65a56, 0x6aaaa6aa9a5a,
    0xaaaaaabaaa6a, 0x555665665aaa, 0x5aa665a65a56, 0x6aaaa6aa9a5a, 0xaaaaaaaaaa6a,
    0x555665665aaa, 0x5aa665a65a56, 0x6aaaa6aa9a5a, 0xaaaaaaaaaa6a, 0x555665665aaa,
    0x5aa665a65a56, 0x6aaaa6aa9a5a, 0xaaaaaaaaaa6a, 0x555665655aaa, 0x569665a65a56,
    0x6aa6a6aa9a56, 0xaaaaaaaa9a5a, 0x5556556559aa, 0x569665a65a55, 0x6aa6a6a65a56,
    0xaaaaaaaa9a5a, 0x5556556559aa, 0x569665a65a55, 0x5aa6a6a65a56, 0x6aaaa6aa9a5a,
    0x5556556555aa, 0x569665a65a55, 0x5aa665a65a56, 0x6aaaa6aa9a5a, 0x55555565556a,
    0x555665665a55, 0x5aa665a65a56, 0x6aaaa6aa9a5a, 0x55555565556a, 0x555665665a55,
    0x5aa665a65a56, 0x6aaaa6aa9a5a, 0x55555555556a, 0x555665665a55, 0x5aa665a65a56,
    0x6aaaa6aa9a5a, 0x55555555556a, 0x555665655a55, 0x5aa665a65a56, 0x6aa6a6aa9a5a,
    0x55555555456a, 0x555655655a55, 0x5a9665a65a56, 0x6aa6a6a69a5a, 0x55555555456a,
    0x555655655a55, 0x569665a65a56, 0x6aa6a6a65a56, 0x55555155455a, 0x555655655955,
    0x569665a65a55, 0x5aa6a5a65a56, 0x15555155455a, 0x555555655555, 0x569665665a55,
    0x5aa665a65a56, 0x15555155455a, 0x555555655515, 0x555665665a55, 0x5aa665a65a56,
    0x15555155455a, 0x555555555515, 0x555665665a55, 0x5aa665a65a56, 0x15555155455a,
    0x555555555515, 0x555665665a55, 0x5aa665a65a56, 0x15555155455a, 0x555555555515,
    0x555655655a55, 0x5aa665a65a56, 0x15515155455a, 0x555555554515, 0x555655655a55,
    0x5a9665a65a56, 0x15515151455a, 0x555551554515, 0x555655655a55, 0x569665a65a56,
    0x155151510556, 0x555551554505, 0x555655655955, 0x569665665a55, 0x155110510556,
    0x155551554505, 0x555555655555, 0x569665665a55, 0x55110510556, 0x155551554505,
    0x555555555515, 0x555665665a55, 0x55110510556, 0x155551554505, 0x555555555515,
    0x555665665a55, 0x55110510556, 0x155551554505, 0x555555555515, 0x555655655a55,
    0x55110510556, 0x155551554505, 0x555555555515, 0x555655655a55, 0x55110510556,
    0x155151514505, 0x555555554515, 0x555655655a55, 0x54110510556, 0x155151510505,
    0x555551554515, 0x555655655a55, 0x14110110556, 0x155110510501, 0x555551554505,
    0x555555655555, 0x14110110555, 0x155110510501, 0x555551554505, 0x555555555555,
    0x14110110555, 0x55110510501, 0x155551554505, 0x555555555555, 0x110110555,
    0x55110510501, 0x155551554505, 0x555555555515, 0x110110555, 0x55110510501,
    0x155551554505, 0x555555555515, 0x100100555, 0x55110510501, 0x155151514505,
    0x555555555515, 0x100100555, 0x54110510501, 0x155151514505, 0x555551554515,
    0x100100555, 0x54110510501, 0x155150510505, 0x555551554515, 0x100100555,
    0x14110110501, 0x155110510505, 0x555551554505, 0x100055, 0x14110110500,
    0x155110510501, 0x555551554505, 0x55, 0x14110110500, 0x55110510501,
    0x155551554505, 0x55, 0x110110500, 0x55110510501, 0x155551554505,
    0x15, 0x100110500, 0x55110510501, 0x155551554505,0x555555555515]
```
4、根据《四库全书 - 协纪辨方书》添加了部分的吉神凶煞、八字，修正了部分八字月柱算法，关于值神方面的算法没有采用农历月算，而是根据农历八字月柱为依据，不同算法之间有细微区别。主要参考了老黄历、聚宝堂日历等，待持续优化
铺注条例：
凡铺注《万年历》、《通书》，先依用事次第察其所宜忌之日，于某日下注宜某事，某日下注忌某事，次按宜忌，较量其凶吉之轻重，以定去取。
凡宜宣政事，布政事之日，只注宜宣政事。
凡宜营建宫室、修宫室之日，只注宜营建宫室。

凡吉足胜凶，从宜不从忌者，如遇德犹忌之事，则仍注忌。

凡吉凶相抵，不注宜亦不注忌者，如遇德犹忌之事，则仍注忌。

凡德合、赦愿、月恩、四相、时德等日，不注忌进人口、安床、经络、酝酿、开市、立券、交易、纳财、开仓库、出货财。如遇德犹忌，及从忌不从宜之日，则仍注忌。
凡天狗寅日忌祭祀，不注宜求福、祈嗣。

凡卯日忌穿井，不注宜开渠。壬日忌开渠，不注宜穿井。
凡巳日忌出行，不注宜出师、遣使。
凡酉日忌宴会，亦不注宜庆赐、赏贺。
凡丁日忌剃头，亦不注宜整容。

凡吉凶相抵，不注忌祈福，亦不注忌求嗣。

凡忌诏命公卿、招贤，不注宜施恩、封拜、举正直、袭爵受封。
凡忌施恩、封拜、举正直、袭爵受封，亦不注宜诏命公卿、招贤。
凡宜宣政事之日遇往亡则改宣为布。
凡月厌忌行幸、上官，不注宜颁诏、施恩封拜、诏命公卿、招贤、举正直。遇宜宣政事之日，则改宣为布。

凡吉凶相抵，不注忌结婚姻，亦不注忌冠带、纳采问名、嫁娶、进人口，如遇德犹忌之日则仍注忌。
凡吉凶相抵，不注忌嫁娶，亦不注忌冠带、结婚姻、纳采问名、进人口、搬移、安床，如遇德犹忌之日，则仍注忌。遇不将而不注忌嫁娶者，亦仍注忌。遇亥日、厌对、八专、四忌、四穷而仍注忌嫁娶者，只注所忌之事，其不忌者仍不注忌。
凡吉凶相抵，不注忌搬移，亦不注忌安床。不注忌安床，亦不注忌搬移。如遇德犹忌之日，则仍注忌。
凡吉凶相抵，不注忌解除，亦不注忌整容、剃头、整手足甲。如遇德犹忌之日，则仍注忌。
凡吉凶相抵，不注忌修造动土、竖柱上梁，亦不注忌修宫室、缮城郭、筑提防、修仓库、鼓铸、苫盖、修置产室、开渠穿井、安碓硙、补垣塞穴、修饰垣墙、平治道涂、破屋坏垣。如遇德犹忌之日，则仍注忌。
凡吉凶相抵，不注忌开市，亦不注忌立券、交易、纳财。不注忌纳财，亦不注忌开市、立券、交易。不注忌立券、交易，亦不注忌开市、纳财。
凡吉凶相抵，不注忌开市、立券、交易，亦不注忌开仓库、出货财。如遇专忌之日，则仍注忌。
凡吉凶相抵，不注忌牧养，亦不注忌纳畜。不注忌纳畜，亦不注忌牧养。
凡吉凶相抵，有宜安葬不注忌启攒，有宜启攒不注忌安葬。

凡土府、土符、地囊，只注忌补垣，亦不注宜塞穴。
凡开日，不注宜破土、安葬、启攒，亦不注忌。遇忌则注。
凡四忌、四穷只忌安葬。如遇鸣吠、鸣吠对亦不注宜破土、启攒。
凡天吏、大时不以死败论者，遇四废、岁薄、逐阵仍以死败论。
凡岁薄、逐阵日所宜事，照月厌所忌删去，所忌依然依从本日。

凡二月甲戌、四月丙申、六月甲午、七月戊申、八月庚辰、九月辛卯、十月甲子、十二月甲子、德合与赦（天赦）、愿（天愿）所会之辰，诸事不忌。

5、星次
星纪、玄枵、娵訾、降娄、大梁、实沈、鹑首、鹑火、鹑尾、寿星、大火、析木