算法系列(十七) 日历生成算法-中国公历(格里历)(下)

【接上篇】

上述计算星期的方法虽然步骤简单,但是每次都要计算两个日期的时间差,不是非 常方便。如果能够有一个公式可以直接根据日期计算出对应的星期岂不是更好?幸运的是,这样的公式是 存在的。此类公式的推导原理仍然是通过两个日期的时间差来计算星期,只是通过选择一个特殊的日期来 简化公式的推导。这个所谓的特殊日期指的是某一年的12月31日这天刚好是星期日这种情况。选择这样的 日子有两个好处,一个是计算上可以省去计算标准日期这一年的剩余天数,另一个是计算出来的日期差余 数是几就是星期几,不需要再计算星期的差值。人们知道公元元年的1月1日是星期一,那么公元前1年的 12月31日就是星期日,用这一天作为标准日期,就可以只计算整数年的时间和日期所在的年积累的天数, 这个星期公式就是:

w = (L * 366 + N * 365 + D) % 7                             (公式 2)

公式中的L是从 公元元年到y年m月d日所在的年之间的闰年次数,N是平常年次数,D是y年内的积累天数。将整年数y - 1 = L + N带入上式,可得:

w = ( (y - 1) * 365 + L + D) % 7                              (公式 3)

根据闰年规律,从公元元年到y年之间的闰年次数是可以计算出来的,即:

将L带入公式2,得到星期w的最终计算公式:

还以2005年5月31日为例,利用公式5计算w的值为:

得到2005年5月31日是星期二,和前面的计算方法得到的结果一致。根据上述分析,可得写出使用公式 5计算星期的算法实现:

146 int TotalWeek(int year, int month, int day)   

147 {   

148     int d = CalcYearPassedDays(year, month, day);   

149     int y = year - 1;   

150     int w = y * DAYS_OF_NORMAL_YEAR + y / 4 - y / 100 + y / 400 + d;   

151    

152     return w % 7;   

153 }

公式5的问题在于计算量大,不利于口算星期结果。于是人们就在公式5的基础上继续推导 更简单的公式。德国数学家克里斯蒂安·蔡勒(Christian Zeller, 1822- 1899)在1886年推导出了著名 的为蔡勒(Zeller)公式:

对计算出的w值除以7,得到的余数就是星期几,如果余数是0,则为星期日。蔡勒公式中各符号 的含义如下:

w :星期;

c :世纪数 – 1的值,如21世纪,则 = 20;

m :月数 ,的取值是大于等于3,小于等于14。在蔡勒公式中,某年的1月和2月看作上一年的13月和14月,比如 2001年2月1日要当成2000年的14月1日计算;

y :年份,取公元纪念的后两位,如1998年, = 98 ,2001年, = 1;

d :某月内的日数

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 公式
, 日期
, 算法 日期
, 如何做一个口算软件
, 算法 公式 
, 天数
, 星期
, 闰年
, 星期5
日历算法
为何格里历又称为公历、公历转农历算法、伊朗日历与公历转换、公历转换农历算法、公历2017年日历,以便于您获取更多的相关知识。

时间: 2024-10-23 14:52:05

算法系列(十七) 日历生成算法-中国公历(格里历)(下)的相关文章

算法系列(七) 爱因斯坦的思考题(下)

CheckGroupRelation()函数需要根据当前组group的位置进行适当的处理,如果当前组是第一个 组或最后一个组,则group的相邻组只有一个,就是最靠近group的组,其它情况下group的相邻组都是 两个.CheckGroupRelation()函数的实现如下: 162 bool CheckGroupRelation(GROUP *groups, int groupIdx, ITEM_TYPE type, int value) 163 { 164 if(groupIdx == 0

算法系列(二十) 计算中国农历(二)

所谓的"天文算法",就是利用经典力学定律推导行星运转轨道,对任意时刻的行星位置进行精确计 算,从而获得某种天文现象发生时的时间,比如日月合朔这一天文现象就是太阳和月亮的地心黄经(视黄 经)差为0的那一瞬间.能够计算任意时刻行星位置的一套理论就被称为星历表,比较著名的星历表有美 国国家航空航天局下属的喷气推进实验室发布的DE系列星历表,还有瑞士天文台在DE406基础上拓展的瑞 士星历表等等.根据行星运行轨道直接计算行星位置通常不是很方便,更何况大多数民用天文计算用不上 那么多精确的轨道参

算法系列(十) 直线生成算法

在欧氏几何空间中,平面方程就是一个三元一次方程,直线就是两个非平行平面的交线,所以直线 方程就是两个三元一次方程组联立.但是在平面解析几何中,直线的方程就简单的多了.平面几何中 直线方程有多种形式,一般式直线方程可用于描述所有直线: Ax+By+C = 0  (A.B不同 时为0) 当知道直线上一点坐标(X0,Y0)和直线的斜率K存在时,可以用点斜式方程: Y-Y0 = K(X – X0) (当K不存在时,直线方程简化成X = X0) 当知道直线上的两个点 (X0,Y0)和(X1,Y1)时,还可

算法系列(十九) 用天文方法计算日月合朔(新月)

中国农历的朔望月是农历历法的基础,而朔望月又是严格以日月合朔发生的那一天作为月首,因此日 月合朔时间的计算是制定农历历法的关键.本文将介绍ELP-2000/82月球运行理论,以及如何用ELP- 2000/82月球运行理论计算日月合朔时间. 要计算日月合朔时间, 首先要对日月合朔这一天文现象进行数学定义.朔望月是在地球上观察到的月相周期,平均长度约等于 29.53059日,而恒星月(天文月)是月亮绕地球公转一周的时间,长度约27.32166日.月相周期长度比恒 星月长大约两天,这是因为在月球绕地球

全排列生成算法 .

参考链接: 全排列生成算法(一) 原文讲的很详细了,为了完整性,这里粘贴的参考链接中大部分文字,并且在原文的基础上,添加了"给定某个排列,求其字典序中上一个元素"的算法. 字典序 全排列生成算法的一个重要思路,就是将集合A中的元素的排列,与某种顺序建立一一映射的关系,按照这种顺序,将集合的所有排列全部输出.这种顺序需要保证,既可以输出全部的排列,又不能重复输出某种排列,或者循环输出一部分排列.字典序就是用此种思想输出全排列的一种方式.这里以A{1,2,3,4}来说明用字典序输出全排列的

算法系列(二十) 计算中国农历(一)

世界各国的日历都是以天为最小单位,但是关于年和月的算法却各不相同,大致可以分为三类: 阳历--以天文年作为日历的主要周期,例如:中国公历(格里历) 阴历--以天文月作为日 历的主要周期,例如:伊斯兰历 阴阳历--以天文年和天文月作为日历的主要周期,例如:中国农 历 我国古人很早就开始关注天象,定昼夜交替为"日",月轮盈亏为"月",寒暑交替为"年" ,在总结日月变化规律的基础上制定了兼有阴历月和阳历年性质的历法,称为中国农历.本文将介绍中国 农历的

[算法系列之二十一]最短摘要的生成

题目描述 你我在百度或谷歌搜索框中敲入本博客名称的前4个字"结构之法",便能在第一个选项看到本博客的链接,如下图2所示: 图2 谷歌中搜索关键字"结构之法" 在上面所示的图2中,搜索结果"结构之法算法之道-博客频道-CSDN.NET"下有一段说明性的文字:"程序员面试.算法研究.编程艺术.红黑树4大经典原创系列集锦与总结 作者:July–结构之法算法-",我们把这段文字称为那个搜索结果的摘要,亦即最短摘要.我们的问题是,请问,

算法系列(十三) 椭圆的生成算法

椭圆和直线.圆一样,是图形学领域中的一种常见图元,椭圆的生成算法(光栅转换算法)也是图 形学软件中最常见的生成算法之一.在平面解析几何中,椭圆的方程可以描述为(x – x0)2 / a2+ (y – y0)2 / b2 = 1,其中(x0, y0)是圆心坐标,a和b是椭圆的长短轴,特别的,当(x0, y0)就是坐标 中心点时,椭圆方程可以简化为x2 / a2 + y2 / b2 = 1.在计算机图形学中,椭圆图形也存在在点阵 输出设备上显示或输出的问题,因此也需要一套光栅扫描转换算法.为了简化,

算法系列(十一) 圆生成算法

在平面解析几何中,圆的方程可以描述为(x – x0)2 + (y – y0)2 = R2,其中(x0, y0)是圆心坐 标,R是圆的半径,特别的,当(x0, y0)就是坐标中心点时,圆方程可以简化为x2 + y2 = R2.在计算 机图形学中,圆和直线一样,也存在在点阵输出设备上显示或输出的问题,因此也需要一套光栅扫描 转换算法.为了简化,我们先考虑圆心在原点的圆的生成,对于中心不是原点的圆,可以通过坐标的 平移变换获得相应位置的圆. 在进行扫描转换之前,需要了解一个圆的特性,就是圆的八分对 成