背景
命理学是对人生命运规律的探索,以人的各式各样的数字(出生年月日、姓名笔划等)来推测人的性格与命运并占卜推测未来会发生的事情。古今中外都有相关方面的理论,中国的周易系列就是探讨这方面的,还有八字命理、紫微斗数、七星命理和占星术等。 正所谓:谋事在人,成事在天。但倘若命理真是注定的,宇宙也将会失去前进的动力。因此命理学虽然存在一定的道理,但是只可用于趋吉避凶,若没有实际行动,那一切也都是枉然。
涉及到方方面面,这里我需要一个阳历农历换算的工具,毕竟我是自己动手主义,并不想花钱调用一些收费API。上网找了一些人写过的代码,同一天得出的干支也不尽相同,我估计他们都只是随便写一个,能换算出一个结果就行,也没有进行大量测试,而我们算命的时候,最怕的就是日子算错了,那一切就白搭了。
我们的目的是实现一个准确的换算,数据必须与如下所示的这个万年历一致:
这里非常感谢晶晶博主的文章:1900年至2100年公历、农历互转Js代码,很详尽,注释也很完整,我们以此为基准进行后续的实现。
实现步骤
-
将大牛写好的JS转换成C#代码,最主要的是solar2lunar函数。
-
访问"https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query={$year}年{$month}月&resource_id=6018&format=json",将year和month替换成需要查询的年月,获取每日的宜忌信息。这里仅有2008年至2020年的数据,其他的还没有更新。
-
从1900年1月1日到2100年12月31日,依次调用上述的函数和API接口,将数据写入SQLServer数据库中,方便后续的查询和其他实现,最终数据表如下所示:
关键点
-
Javascript中的Date对象,十二个月份取值范围是0-11,1900年1月1日在Javascript中是new Date(1900,0,1),而在C#中是new DateTime(1900,1,1),因此在转换JS函数时要特别注意各个月份变量+1,-1的处理。
-
Javascript中的UTC() 方法可根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。在C#中可以用如下代码实现:
private double UTC(int y, int m, int d) { return (new DateTime(y, m, d) - new DateTime(1970, 1, 1)).TotalMilliseconds; }
-
注意这里不用判断年份是在1970年之前还是之后,在1970年之前(如1900年)的直接返回一个负值即可。
-
从API返回的数据中,有些阳历2月份的数据有30天和31天,而很明显我们阳历2月份,只有28天或者29天,需要处理一下。
结束语
命理,是生命的道理。
“命运”包括两个含义,一是命,即由命主的八字所组成的一定的排列组合,由它所反映的吉或凶,福或祸,同一时辰那一瞬间同时落地的孩子,他们的命早已注定。二是运,即人一生所走过的每个阶段,家庭、社会、人事际遇的不同,成就了不同的个体。“命”和“运”的组合构成了千姿百态的人生“命运”。
很多人说,既然命是注定的,那算也是这个,不算也是这个命啊,那又何必算呢?就算你算的再准又有什么意义呢?岂不是浪费时间?
算命其实和体检颇有些相似之处。你的身体条件、有什么遗传基因、可能会在什么年纪导致什么疾病,这是先天带来的,是父母遗传的,DNA,嗯,以当前的科学解释是没办法改变的。那大家何必去医院检查身体呢?大可不必去啊,反正有遗传会得肝病的,始终会得肝病,有遗传会得心脏病的人,终归会得心脏病,又何必去检查呢?再说了,就算检查出来了,又有什么用呢?反正这些遗传病也不好治?可他们完全不明白,按时去医院体检,可以最大限度的调整好自己的身体状态,就算遗传病是不可避免的,但是起码医生可以帮助病人将发病的时间延后、或者减轻痛苦、甚至延长生命。
其实,这就是改运的一种表现。所以,同样的道理,我们算命的意义,就在于躲避、减轻人生道路上可能会出现的未知灾难。尽管因为受到先天条件的限制,完全改变命运是不可能的,但是在某一段路上改善一下却是完全可以做到的。