用C#实现一个百度万年历
背景
命理学是对人生命运规律的探索,以人的各式各样的数字(出生年月日、姓名笔划等)来推测人的性格与命运并占卜推测未来会发生的事情。古今中外都有相关方面的理论,中国的周易系列就是探讨这方面的,还有八字命理、紫微斗数、七星命理和占星术等。 正所谓:谋事在人,成事在天。但倘若命理真是注定的,宇宙也将会失去前进的动力。因此命理学虽然存在一定的道理,但是只可用于趋吉避凶,若没有实际行动,那一切也都是枉然。
涉及到方方面面,这里我需要一个阳历农历换算的工具,毕竟我是自己动手主义,并不想花钱调用一些收费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,嗯,以当前的科学解释是没办法改变的。那大家何必去医院检查身体呢?大可不必去啊,反正有遗传会得肝病的,始终会得肝病,有遗传会得心脏病的人,终归会得心脏病,又何必去检查呢?再说了,就算检查出来了,又有什么用呢?反正这些遗传病也不好治?可他们完全不明白,按时去医院体检,可以最大限度的调整好自己的身体状态,就算遗传病是不可避免的,但是起码医生可以帮助病人将发病的时间延后、或者减轻痛苦、甚至延长生命。
其实,这就是改运的一种表现。所以,同样的道理,我们算命的意义,就在于躲避、减轻人生道路上可能会出现的未知灾难。尽管因为受到先天条件的限制,完全改变命运是不可能的,但是在某一段路上改善一下却是完全可以做到的。
用C#实现一个百度万年历的更多相关文章
- 推荐一个百度网盘搜索工具www.sososo.me
推荐一个百度网盘搜索工具 http://www.sososo.me
- 用python写一个百度翻译
运行环境: python 3.6.0 今天处于练习的目的,就用 python 写了一个百度翻译,是如何做到的呢,其实呢就是拿到接口,通过这个接口去访问,不过中间确实是出现了点问题,不过都解决掉了 先晾 ...
- HTML连载31-制作一个百度首页
一. 我们制作一个百度首页作为练习,可直接复制该代码保存后缀名为.html来查看 <!DOCTYPE html> <html lang="en"> < ...
- 面试一个百度T7程序员,一道简单的题没答上来!网友却都在吐槽面试官!
程序员面试时都考些什么? 一个面试官得意洋洋地说自己面了一个百度T7,出了一道coding题,结果对方连最长上升子序列都写不出来. 楼主本想嘲弄一下百度T7的代码水平低,没想到网友们炸开了锅,纷纷 ...
- 实现了一个百度首页的彩蛋——CSS3 Animation简介
在百度搜索中有这样一个彩蛋:搜索“旋转”,“跳跃”,“反转”等词语,会出现相应的动画效果(搜索“反转”后的效果).查看源码可以发现,这些效果正是通过CSS3的animation属性实现的. 实现这个彩 ...
- 使用python和selenium写一个百度搜索的case
今天练习的内容主要写了一个小功能,在百度上搜索某词汇,然后实现web上的back功能 代码如下: import unittest from selenium import webdriver from ...
- nw.js---开发一个百度浏览器
使用nw.js开发一个简单的百度浏览器就很简单了,只需要在配置里面写入: { // "main": "index.html", "main" ...
- 一个百度MAP导航的基础封装
项目中需要根据点击时候点击的内容,输入百度地图查找并展示规划等相关功能 于是封装了一个单独的百度map的html页面以供调用 功能包括了 ①展示底图 ②切换卫星图,切换卫星路线图,切换普通地图 ③通过 ...
- 发现一个百度的密码。。。记最近一段时间的php感想
请看图. 突然想看一下百度的cookie. 最近百度一年真是多攒多难,我一直挺百度啊.百度文化就是程序员文化,但是收到中国其他文化的侵蚀,不得不变, 任何人重构系统,都会有大概百分三十左右的性能提升. ...
随机推荐
- chr()//ord() //进制转换函数//eval()//文件函数//split()
1.chr() 函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 用法:chr(i) i可以是10进制也可以是16进制的形式的数字. 2.or ...
- (转)绝对路径${pageContext.request.contextPath}用法及其与web.xml中Servlet的url-pattern匹配过程
以系统的一个“添加商品”的功能为例加以说明,系统页面为add.jsp,如图一所示: 图一 添加商品界面 系统的代码目录结构及add.jsp代码如图二所示: 图二 系统的代码目录结构及add.js ...
- sync实现windows与nginx主机端文件同步(参考文档)
资源 Rsync官网:http://rsync.samba.org/ 简介 Rsync(remote sync)是类unix系统下的远程(LAN/WAN)数据镜像备份工具.可以实现Linux与linu ...
- ansible删除目录下所有内容
使用ansible的同学都知道,ansible只支持新增删除具体的某个文件夹或者文件,如下所示: 1. 创建目录,删除整个目录 - name: Create a directory if it doe ...
- Java多人聊天室第一版
package cn.zhang.chat; import java.io.BufferedReader; import java.io.PrintWriter; /** * 所有用户均有的信息,单独 ...
- awk中传参方式
结合编辑数据文件的shell脚本学习awk传参方式,该脚本功能: a.取VIDEOUSR_11082017_0102_ONLINE_STASTIC.dat文件中第87个字段的低8位: b.将每行数据的 ...
- 解决Maven项目报错Perhaps you are running on a JRE rather than a JDK?
问题描述: 在创建SpringMVC项目运行构建项目的时候,发现构建失败.报错信息为Maven-No compiler is provided in this environment. Perhaps ...
- Flink(四) —— 数据流编程模型
分层抽象 The lowest level abstraction simply offers stateful streaming. It is embedded into the DataStre ...
- 感知机分类(perceptron classification)
概述 在机器学习中,感知机(perceptron)是二分类的线性分类模型,属于监督学习算法.输入为实例的特征向量,输出为实例的类别(取+1和-1). 感知机对应于输入空间中将实例划分为两类的分离超平面 ...
- share团队冲刺3
团队冲刺第三天 昨天:完成了对输出文字,按钮控件的添加,能够将其在模拟器上运行 今天:学习输入的添加方式 问题:Android resource linking failed 在改变按钮样式的时候,出 ...