万年历计算 之 干支

万年历计算 之 干支
万年历计算 之 干支

万年历计算之干支

1、基本知识

中国古代的一种纪年法。即以甲、乙、丙、丁、戊、己、庚、辛、壬、癸为十干,子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥为十二支,把干、支顺序配合。如甲子、乙丑等,经过六十年又回到甲子。周而复始,循环不已。我国农历现仍沿用干支纪年。本文中,我将计算公历某年某月某日某时的干支称为排四柱(该名称来源于传统的命理算卦)。本文中将现行公历和格里高利历理解为同一种立法。由于干支纪年法是以60 年一轮回的周期,周而复始,循环不已。所以无法用某个单纯的公式计算,只能推算(仅本人看法),既然推算就必须有个起点,本文中已公历1583年1月1日为起点(儒略日1582年10

月4日为格里高利日1582年10月15日)。通过查阅权威资料我们可知道,公历公历1583年1月1日的年、月、日干支为壬午年壬子月壬辰日。有了这个起点,再利用干支纪年的规律就好推算了。2、日柱的计算

日柱, 即日期用干支来表示。日柱的计算比较简单,说它简单是因为日柱的计算比较独立。需要注意的是,日柱的交界点为凌晨12点(普遍这么认为),此时刚好为子时(23:00 - 1:00),故将23:00 - 24:00 称为初子时,意为今夜

之子时,非明日之早。将24:00 - 1:00 称为正子时,意为明日之早。业界普遍将日柱分界点定位初子时,意思就是说初子时算今天,正子时算明天。(呵呵,绕口的)首先,需要计算公历1583年1月1日至你要计算干支的公历日期(当天算在内)的相隔天数(由于这个比较容易这里就不罗列出代码了)。然后,我这里给出一个我自己推导出的简单 c 语言公式:// 天干

int nHeavenlyStems = (相隔天数% 10 + 8) % 10 - 1; // 地支

int nEarthlyBranches = (相隔天数% 12 + 4) % 12 - 1; 接下来再简单修正一下:

if(hour >=23 || hour == 0)

{

// 已初子时为界(第二天的开始)

nHeavenlyStems++;

nEarthlyBranches++;

} nHeavenlyStems = (nHeavenlyStems == -1) ? 9 : nHeavenlyStems;

结果为0 - 9,依顺序分别代表甲、乙、丙、丁、戊、己、庚、辛、壬、癸十干

nEarthlyBranches = (nEarthlyBranches == -1) ? 11 : nEarthlyBranches;

结果为0 - 11,依顺序分别代表子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥十二支注意:日柱交界点是以初子时为界

3、时柱的计算

时柱, 即时辰用干支来表示。时柱的地支是确定的。古人将每 2 小时称为一个时辰,一天共12 时辰,刚好对应12 地支,由凌晨1点开始每两小时对应于一地支,依次为:子丑寅...以下是对照表:子

丑寅卯辰己

23-01 01-03 03-05 05-07 07-09 09-11

午未申

酉戊亥

11-13 13-15 15-17 17-19 19-21 21-23

时柱的地支,这里我给出我自己推导出的简单c 语言公式:// 地支

int nEarthlyBranches =

static_cast<int>(ceil(hour / 2.0));

nEarthlyBranches = (nEarthlyBranches == 12) ? 0 : nEarthlyBranches;

结果为0 - 11,依顺序分别代表子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥十二支时柱的天干是不固定的,但可根据下面日上起时标推算时柱的天干(就是说时柱的天干和日干有关)

日上起时表

时\日甲己乙庚丙辛

丁壬戊癸

子甲子丙子戊子

庚子壬子

丑乙丑丁丑己丑

辛丑癸丑

寅丙寅戊寅庚寅

壬寅甲寅

卯丁卯己卯辛卯

癸卯乙卯

辰戊辰庚辰壬辰

甲辰丙辰

巳己巳辛巳癸巳乙巳丁巳

午庚午壬午甲午丙午戊午

未辛未癸未乙未丁未己未

申壬申甲申丙申戊申庚申

酉癸酉乙酉丁酉己酉辛酉

戌甲戌丙戌戊戌庚戌壬戌

亥乙亥丁亥己亥辛亥癸亥

时柱的天干,这里我给出我自己根据上表推导出的简单 c 语言公式:首先,需要计算公历1583年1月1日至你要计算干支的公历日期(当天算在内)的相隔天数(由于这个比较容易这里就不罗列出代码了)。

// 天干

int nHeavenlyStems = (相隔天数% 10 + 8) % 10 - 1);

nHeavenlyStems = (nHeavenlyStems ==

-1) ? 9 : nHeavenlyStems;

nHeavenlyStems = ((nHeavenlyStems % 5) * 2 + nEarthlyBranches) % 10;

注意:时柱地支是固定的,天干与日柱天干有关。

4、月柱的计算

月柱,即月份用干支来表示。月柱的计算相对是最复杂的,因为月柱交界是以24 节气中的节气(令)的时间为交界点的,所以要准确计算月柱首先必须有能力就算24 节气的时间。(关于24 节气的计算,不明白的朋友可以参考的另一篇文章万年历计算之节气)首先,根据24 节气的规律推导出该月所对应的节气(令),这里我给出我自己推导出的简单 c 语言公式:太阳黄经角度(节气)= month >= 4 ? 15 + (month - 4) * 30 : 270 + month * 15; 其次,计算该节气的具体发生时间(参:万年历计算之节气),如果采用我的节气就算方法,那么计算出来的节气时间为格林尼治时间(UTC),还需进一步转变为本地时间(LST)。再次,根据月柱的交界点条件,适当调整节气当地月份时间,公式如下:(monthLST,dayLST 为指定节气发生的本地时间)

monthLST = (monthLST > month) || ((monthLST == month && dayLST > day)) ?

month - 1 : month;

最后,利用我自己推导出的简单c 语言公式:

// 天干

int nHeavenlyStems = ((year - 1583) * 12 + monthLST + 12 - 4) % 10;

结果为0 - 9,依顺序分别代表甲、乙、丙、丁、戊、己、庚、辛、壬、癸十干// 地支

int nEarthlyBranches = ((year - 1583) * 12 + monthLST + 12) % 12;

结果为0 - 11,依顺序分别代表子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥十二支注意:monthLST,dayLST 为指定节气发生的本地时间

节气计算的结果为UTC 时间,需要转换为LST 时间

月柱的交界点为24 节气中的节气(也就是令)5、年柱的计算

年柱, 即年份用干支来表示。需要注意的是,年柱的交界点(也就是上一年和下一年的分界线)是以立春这一天的交节时刻划分的,而不是已农历的正月初一。因此,会出现某一天有两种年柱的现象,月柱、日柱,时柱都需要注

意这点(下面不再提及)。故

首先,计算当年的立春时间(注意转换为本地时间)其次,根据年柱的交界点条件,适当调整节气的本地年份时间,公式如下:(yearLST,monthLST,dayLST 为指定节气发生的本地时间)

yearLST = (st_month > month ||

((st_month == month) && st_day > day)) ? yearLST - 1 : yearLST; 最后,我这里给出一个我自己推导出的简单 c 语言公式:// 天干

int nHeavenlyStems = (yearLST - 1583 + 36 - 7) % 10;

结果为0 - 9,依顺序分别代表甲、乙、丙、丁、戊、己、庚、辛、壬、癸十干

// 地支

int nEarthlyBranches = (yearLST - 1583 + 36 - 5) % 12;

结果为0 - 11,依顺序分别代表子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥十二支注意:year 代表你要计算年干支的那一公历年。

年柱交界点为立春。

全文完。

Excel中关于日期的计算公式的运用

Excel中关于日期的计算公式的运用 方法1:在A1单元格输入前面的日期,比如“2004-10-10”,在A2单元格输入后面的日期,如“2005-6-7”。接着单击A3单元格,输入公式 “=DATEDIF(A1,A2,"d")”。然后按下回车键,那么立刻就会得到两者的天数差“240”。 提示: 公式中的A1和A2分别代表前后两个日期,顺序是不可以颠倒的。此外,DATEDIF函数是Excel中一个隐藏函数,在函数向导中看不到它,但这并不影响我们的使用。 方法2:任意选择一个单元格,输入公式“="2004-10-10"-"2005-6-7"”,然后按下回车键,我们可以立即计算出结果。 计算工作时间——工龄—— 假如日期数据在D2单元格。 =DATEDIF(D2,TODAY(),"y")+1 注意: 工龄两头算,所以加“1”。 如果精确到“天”—— =DATEDIF(D2,TODAY(),"y")&"年"&DATEDIF(D2,TODAY(),"ym")&"月 "&DATEDIF(D2,TODAY(),"md")&"日" 二、计算2003-7-617:05到2006-7-713:50分之间相差了多少天、多少个小时多少分钟 假定原数据分别在A1和B1单元格,将计算结果分别放在C 1、"D1和E1单元格。

C1单元格公式如下: =ROUND(B1-A1,0) D1单元格公式如下: =(B1-A1)*24 E1单元格公式如下: =(B1-A1)*24*60 注意: A1和B1单元格格式要设为日期,C 1、"D1和E1单元格格式要设为常规. 三、计算生日,假设b2为生日 =datedif(B2,today(),"y") DATEDIF函数,除Excel2000中在帮助文档有描述外,其他版本的Excel在帮助文档中都没有说明,并且在所有版本的函数向导中也都找不到此函数。但该函数在电子表格中确实存在,并且用来计算两个日期之间的天数、月数或年数很方便。微软称,提供此函数是为了与Lotus1-2-3兼容。 该函数的用法为“DATEDIF(Start_date,End_date,Unit)”,其中Start_date为一个日期,它代表时间段内的第一个日期或起始日期。End_date为一个日期,它代表时间段内的最后一个日期或结束日期。Unit为所需信息的返回类型。 “Y”为时间段中的整年数,“M”为时间段中的整月数,“D”时间段中的天数。“MD”为Start_date与End_date日期中天数的差,可忽略日期中的月和年。“YM”为Start_date与End_date日期中月数的差,可忽略日期中的日和年。“YD”为Start_date与End_date日期中天数的差,可忽略日期中的年。比如,B2单元格中存放的是出生日期(输入____年__月__日时,用斜线或短横线隔开),在C2单元格中输入“=datedif(B2,today(),"y")”(C2单元格的格式为常规),按回车键

一个计算万年历的简单程序

一个计算万年历的简单程序 通常我们只知道生活当天的前后几天是星期几,即便是翻日历,也只能知道有限日期的星期数。那么有没有一种方法可以让我们知道任何一天是星期几呢?有,下面我将向大家介绍一种方法,用以编写万年历的程序。 首先我们必须约定一些法则,我们用Y、M、D分别表示年、月、日,用数字0-6分别表示星期日-星期六,这样我们就可以开始推导我们的公式了。 我们知道2002年9月1号为星期日,如果我们要想知道2002年9月10号为星期几,可以这样算:(0+(10-1))%7=(0+9)%7=2,即星期二。同样可算得2002年9月20号为:(0+(20-1))%7=(0+19)%7=5,即星期五。但是这样算需要把日期减1,不太方便,为了解决这个问题,我们可以假设每个月有一个0号,由于2002年9月1号为星期日,那么2002年9月0号为星期六,这样算9月10号,只需代入10既(6+10)%7=2。事实上,9月0号也就是8月31号,每个月0号的星期数实际上就是每个月1号的前一天的星期数。我把这个星期数称之为每个月的代码。有了这个代码,要算这个月任一天的星期数都好办了。 以上讨论的是一年中每个月的代码,事实上对于每年也有一个代码,这个代码就是每年1月0号(即1月1号的前一天)的星期数,也就是一月份的代码。如果我们能够找到每年的代码之间的关系,那么要计算万年历就易如反掌了。 (一)推算年的代码公式 我们都知道,平年一年有365天,即52周多1天。闰年为366天即52周多2天。我们先只考虑平年的情况。 假设第N年的代码为W,则第N+1年的代码为(W+1)%7,而第N+K年的代码则为(W+K)%7。这是因为从第N年到第N+K年共经过了K年,每过一年也就是过了52周余1天,经过K年也就是过了52*K周余K天,将多余的天数K加上第N年的代码W再对7取模,所得也就是第N+K年的代码了。 下面我们把闰年也考虑进来。判断闰年的规则是,能被4整除,并能被100和400同时整除的年份就是闰年。所以从第N年到第N+K年间共有K/4 -K/100+K/400个闰年,而每个闰年有52周余2天,要比平年多余了1天,即共多余了K/4-K/100+K/400天。我们应该把这些天也加进去,所以第N+K年的代码应为(W+K+K/4-K/100+K/400)%7。 这样子是不是就考虑完全了呢?并非如此,我们还有两点没考虑到。第一点是第N年是不是闰年。如果第N年是闰年的话,它本身就是52周余2天,而我们在上面却是把它当作平年来计算的,少算了1天,应加上。所以在第N年为闰年的时候上式应为 (W+(K+1)+K/4-K/100+K/400)%7。第二点是第N+K年是不是闰年。如果第N+K年是闰年,虽然它有52周余2天,但只有在算第N+(K+1)年的时候,才需要多加它那一天,而在算第N+K年的时候不需要多加这1天,因此我们必须将上式改为 (W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7(注意千万不能改为 (W+(K+1)+(K/4-K/100+K/400-1))%7=(W+K+K/4-K/100+K/400)%7)。 由此我们可以得出当第N年为闰年时,第N+K年的代码计算式为: A=(W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7 为了方便计算,我们可以取N为0,也就是假设公元元年的代码为W。因为公元元年也是闰年,符合上式,那么当我们输入的年份为Y时,此时就有K=Y,也就是说第Y年的代码为 A=(W+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7

电子表格日期公式

竭诚为您提供优质文档/双击可除 电子表格日期公式 篇一:excel中几个时间计算公式 假设b2为生日 =datedif(b2,today(),"y") datediF函数,除excel2000中在帮助文档有描述外,其他版本的excel在帮助文档中都没有说明,并且在所有版本的函数向导中也都找不到此函数。但该函数在电子表格中确实存在,并且用来计算两个日期之间的天数、月数或年数很方便。微软称,提供此函数是为了与lotus1-2-3兼容。 该函数的用法为 “datediF(start_date,end_date,unit)”,其中start_date 为一个日期,它代表时间段内的第一个日期或起始日期。end_date为一个日期,它代表时间段内的最后一个日期或结束日期。unit为所需信息的返回类型。 “y”为时间段中的整年数,“m”为时间段中的整月数,“d”时间段中的天数。“md”为start_date与end_date日期中天数的差,可忽略日期中的月和年。“ym”为start_date 与end_date日期中月数的差,可忽略日期中的日和年。“yd”

为start_date与end_date日期中天数的差,可忽略日期中的年。比如,b2单元格中存放的是出生日期(输入年月日时,用斜线或短横线隔开),在c2单元格中输入 “=datedif(b2,today(),"y")”(c2单元格的格式为常规),按回车键后,c2单元格中的数值就是计算后的年龄。此函数在计算时,只有在两日期相差满12个月,才算为一年,假如生日是20xx年2月27日,今天是20xx年2月28日,用此函数计算的年龄则为0岁,这样算出的年龄其实是最公平的。 身份证号提取年龄 =datediF(--text((len(a1)=15)*19”即可获得当时的日期时间; 2、使用公式:用=now()而非=date(),=date()只有日期,然后进行菜单“工具->选项”,选择“重新计算”页,选中“人工重算”,勾不勾选“保存前自动重算”看自己的需要和想法了,如果勾选了,那日期时间那总是最后一次保存的日期时间,不勾选的话,如果你的表格中有公式记得准备存前按F9 篇二:excel函数--时间和日期函数 时间和日期函数 1.date 用途:返回代表特定日期的序列号。

电子万年历

河北科技师范学院课程设计说明书 题目: 学院(系): 年级专业: 学号: 学生姓名: 指导教师:

摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。 我选用的是单片机8052来实现电子万年历的功能。该电子万年历能够成功实现时钟运行,调整,显示年月日时分秒及星期,温度等信息。 该电子万年历使用12MHZ晶振与单片机8052相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。所以在该设计与制作中我选用了单片机8052,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, 单片机8052的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。 因此,采用单片机8052原理制作的电子万年历,不仅仅在原理上能够成功实现计时等功能,也更经济,更适用,更符合我们实际生活的需要,对我们大学生来说也更加有用。

根据公历日期计算星期的公式

根据公历日期计算星期的公式 蔡勒(Zeller)公式:是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。 公式如下: W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1 公式中的符号含义如下: w:星期;(w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六) c:世纪(前两位数) y:年(后两位数) m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算) d:日 [ ]代表取整,即只要整数部分。 下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1 =49+[12.25]+5-40+[28.6] =49+12+5-40+28 =54 (除以7余5) 即2049年10月1日(100周年国庆)是星期五。 再比如计算2006年4月4日,过程如下: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1 =-12 (除以7余2,注意对负数的取模运算!) 不过,以上的公式都只适合于1582年(我国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。 后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通用的历法,简称格里历或公历。 若要计算1582年10月4日及之前的日期是星期几,则公式为:

电子万年历

第一章绪论 1.1设计背景 从改革开放开始,电子工业已成为科技创新的重要领域,我国的电子产业也在新世纪开始高速发展,无论是产业结构,产业规模和技术水平都有了十分明显的进步和提升,而且电子产品在各个领域都有开创性的发展,使我们的生活变得更加智能化,为我国经济的发展做出了杰出的贡献。其中,单片机的大规模使用为我们的生活创造了极大的便利,可以说无时无刻不在影响着我们的生活。何为单片机,单片机全名为单片微控制器,它的结构组成就是将微型计算机的基本功能部件全都集成在一个半导体芯片上。尽管仅仅是一个芯片,但从单片机的构成和功能的角度来看充分具备一个计算机系统的中央处理功能。最重要的优点是,单片机体积小巧,可以任意嵌入到任何符合条件的应用系统中作为中央处理器进行指挥决策,是系统实现完全的智能化。当今世界,单片机已经无时无刻不在我们生活的周边存在,各类电子产品几乎都以单片机作为主控核心,通过单片机的控制使之更加智能快速,使我们的生活更加舒畅和方便。正是随着日常周边科学技术的进步,人们对待生活用品的要求也在逐步提高,时钟亦是如此,从古至今,人们对时间的概念就非常重视,从日晷到摆钟,经历了百年的发展,如今,人们对时钟的要求不仅仅是能够知道时间,还需要能够知道日期,星期,节气,天气情况等等,以便于满足人们对生活的各种需要,由此电子万年历就诞生了,正是因为电子万年历功能的多样性,使它在应用在各种场合,人们对它的需求量也就却来越大,电子万年历的发展空间也越来越广阔,成为了一项重要的产业。 1.2设计的目的及意义 中国从古至今就有重视时间的好传统,农民通过日照和鸡叫开始一天的劳作,商人通过古老的计时工具来确认是否应该开门迎客,学士知道时间后则开始一天的读书学习,这种传统一直绵延至今。当今社会,人们的生活节奏飞快,在工作中讲究快速和效率,需要在最短的时间内完成最合理的工作要求,所以人们通常需要在最短的时间内了解到最丰富的信息,人们不满足于只能看到此时此刻的时间信息,还需要了解过去和未来几天内的时间情况,包括农历,天

万年历的算法

摘自: 星期、干支、二十八宿计算公式打印本页关闭本窗口 1. 求星期公式 星期=[5+A(实际天数)] mod 7 2. 干支计算公式 六十甲子干支序号,从1->59->0。 六十甲子干支序号=[23+A(实际天数)] mod 60 3. 二十八宿计算公式 二十八宿序号=[23+A(实际天数)] mod 28 4. 实际天数A的计算 A=B(基本天数)+C(闰日天数) B=(计算年-1)*365+(要计算到年的月日天数) 例:1984年2月1日的基本天数B=(1984-1)*365+(31+1)=723827(天), 其中,31是1月为31天,1为2月1日为1天。 公元308年8月28日的基本天数 B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294(天) 这里的(要计算到年的月日天数),用的是公历,月日天数的规则我好 象小学就学过了。哈哈…… C=(计算年-1) div 4 -误差修正值+ fixValue2 fixValue2为0或者1。常值为0,当年数为闰年(公历闰年法)之中的3月 1日之后的为1。 误差修正值推算: 公元元年1月1日至1582年10月14日为0。 1582年10月15日至1699年12月31日为10。 从1701年1月1日起每增加一个世纪累加1,但能被400除尽的世纪不累 加1。此方法推算即可。 --有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有 讲到,但看来应该是10。 例1701年1月1日起误差值为11,而1801年1月1日起误差修正值为12,而1901年1月1日起误差修正值为13, 但2001年误差修正值仍为13,因为2000年能被400整除,故不累加。而2101年1月1日起误差修正值为14。 5. 实例:1998.3.15的星期、干支与二十八宿 B=(1998-1)*365+(31+28+15)=728979 C=(1998-1) div 4 - 13 + 0 = 486 A=B+C=728979+486=729465 星期序号=(5+729465) mod 7=0,即为星期日 干支序号=(13+729465) mod 60=58,即为辛酉

万年历

程序设计综合实践报告 (C语言) 项目名称:桌面万年历 班级:信息与计算2010级1班 姓名:郭玉豪 学号:201001051506 山东科技大学信息科学与工程学院 2012年12月

目录 1. 项目概述 (3) 1.1 需求陈述 (3) 1.2 开发技术、环境与工具 (3) 2. 软件需求 (4) 2.1 功能性需求 (4) 3. 软件架构设计 (4) 4. 软件详细设计与实现 (5) 4.1 主要模块的流程图 (5) 4.2 核心代码 (5) 5 总结与体会 (21) 5.1遇到的问题与解决途径 (21) 5.2 心得体会 (22)

1. 项目概述 1.1 需求陈述 本项目是桌面时钟与万年历的实现,时钟可以实现年月日、时分秒、天干地支及生肖的输出,并且还能显示阴历的日期。右击时钟会选中日历会出现日历的输出。日历上显示今天阳历的年月日、阴历的年月日、干支年,生肖及图片,并且右边还有年和月的加减,点击今日按钮时间就立刻转的电脑本地的日期。日历本身显现阳历与阴历,和国家法定节假日。在日历的右上角有个取消按钮。为了增加日历的外观,增加了换肤按钮,使得本万年历更加人性化。 1.2 开发技术、环境与工具 1.2.1(DrawClockText) 此函数给出了表盘的的年月日与时分秒、干支年和生效年的输出调用。 1.2.2(DrawCalendar) 此函数是日历表的输出函数,它实现了日历表的输出阳历时间和阴历时间,生肖与干支年的输出。1.2.3(用到的API函数) API函数参考: GetLocalTime: 获得当前时间(公历:年、月、日、周); MoveToEx: 移动划线的起点; LineTo: 绘制到某一点; SetTextColor: 设置要绘制的文字颜色; TextOut: 绘制文字; GetLocalTime:获得当前系统的本地时间; 结构体类型参考: SYSTEMTIME: 描述时间类型,包括年月日、时分秒、周; 系统调用: 根据已给样本的提示,绘制了日历的矩形背景,并且也根据公历日期来计算出农历日期,并且标注了一些重要节日,像“春节、元宵节、国庆节、端午节、中秋节”等一些重要的节日,并且将节假日的字体颜色设置为红色,然后又写了获取当前系统本机时间的函数,成功的获得了当前本机的时间,这在日历中就可以观察到。

时间计算和日期推算

时间的计算与日期的变更 地方时的计算和日期的变更是高考考查的重点内容,该知识点与人类生产、生活密切相关,题目选材容易,而且能很好地体现以能力测试为主,考查学生基础知识、基本技能的掌握和运用这些基础知识分析、解决问题的能力。近几年高考试题都有体现,而且题目越来越灵活。 地方时的计算方法 (1)先求经度差:①如果两地同位于东经度或西经度,用大的度数减去小的度数;②如果一地位于东经度,一地位于西经度,两地的度数相加。 (2)将经度差转化为时间差:按经度每隔150,地方时相差1小时,每隔10地方时相差4分钟进行换算。 (3)利用公式求时间:所求地方时=已知地方时±时间差(所求地位于已知地的东方,用“+”号;所求地位于已知地的西方,则用“—”号)。 地方时的计算要注意以下几点 (1)明确由于地球自西向东转,同一纬线上东边的地点比西边地点先看到日出,东早西迟是计算地方时的关键。 (2)明确地方时与区时的联系,先确定对应点的时区,求出时区差。 (3)确定某一地点的地方时,该点可能是已知的,也可能是图中或题目条件中隐含的。 (4)明确地方时的换算关系1小时/15°;4分种/1°;4秒/1′,“东加西减”。 (5)计算过程注意相加大于24小时要加一天,相反,相减,不够减时,借24小时,日期相应退一天。 2.日期的变更 (1)先确定日界线的位置即180°经线。 (2)按地球自转方向越过日界线采用“东减西加”的原则。 (3)注意越过日界线计算日期时,要注意星期的变化,月份的变化(大小月差异,平年与闰年的月份变化),年份的变化。 (4)确定某一日期所占比例时除确定180°经线外,还要找到“零”时对应经线。 区时的计算方法 (1)直线法,也可叫数数法。直线法就是先画一条直线,在这条直线上划分出24等分,标注出24个时区。在图中标注出已知地点所在时区和未知地点所在时区。根据每向东跨越一个时区,时间增加一小时;每向西跨越一个时区,时间减少一小时,一个一个地往前(后)数。数数法最好避开日界线,即将中时区放在中间,而把东西十分开。 (2)公式法:利用公式法进行区时计算的步骤大致是: 第一步:求时区差,关于时区差计算:以中时区为参照物,同侧相减,异侧相加。 第二步:求区时,所求地的区时=已知地的区时+时区差*1小时,若所求地在已知地之东则用“加”,反之,所求地在已知地之西,则用“减”,若求出的时间大于24小时,则减24,日期加1天,若时间为负值,则加24小时,日期减去1天 ①求时区:即已知某地的经度求该地的时区。其换算公式是: 某地时区序数=该地经度÷150(所得商数,按数学求近似值的方法保留整数位,小数点后四舍五入,就是该地的时区数。或若①余数>7.5,则商+1为时区数;②若余数<7.5,则商为时区数。)所求地为东经度则求出的是东时区;所求地为西经度则求出的为西时区。除中时区的中央经线是00外,其余时区的中央经线都是150的倍数;相邻一个时区区时相差1小时。 ②求区时差.:区时差的求法有两种情况。 A、两地都在东时区或西时区,则:区时差=(大时区数—小时区数)X1小时; B、两地中一地在东时区,一地在西时区,则: 区时差=(东时区数+西时区数)文1小时(不过日界线) 或区时差=[(12—东时区数)+(12—西时区数)]X1小时(过日界线)。 ③求区时:区时的计算可以分两种情况:过日界线或不过日界线。 不过日界线:所求地区时=已知地区时±区时差(所求时区在已知时区以东,用“+”号;所求时区在已知时区以西,用“—”号。) 过日界线:A、所求地区时=已知地区时+区时差—1天(所求时区在已知时区以东); B、所求地区时=已知地区时—区时差+1天(所求时区在已知时区以西)。 ④如果有飞行时间(即路程时间),则要加上路程时间。 还可以用一个更为简便的公式。先假设东1区、东2区......东12区分别用代号+1、十2、 (12) 示;西1区、西2区……西12区分别用代号—1、—2、……—12表示,中时区用0表示,就可以根据题

手算万年历

一只左手即是万年历 掐指一算即知吉凶”,学过算命卜卦的人对吉凶的推算应该没多大问题,但要做到掐指就能算并非一照一夕的事(除相术外)。 因为所有算法基本上都要用到干支历,所以你看很多算命算卦的都要有本万年历。其实,我们的左手就是一本万年历,许多人不知道,所以不会推算。当然,这也是算命达到出神入化的关键技术,你想如果什么也不用,就能把四柱在心中排出,对求测者来说更加神奇。现把一种最简单的掐指法介绍出来。 (此法在网上公布了数个小时,因为是秘籍,所以被删掉。其中日柱掐指之法并非真法,并有错误在其中,真法没传,真法不用计算,不用万年历,只需掐指即可推出。想学者,可以拿秘籍来交流,只求风水方面的,我所掌握的除外) 现举一例说明:(阳历换算干支) 随便说一个时间,2018年3月10日早8点:左手,拇指掐“子”上后退3个两位(3为8,9,10三个)为“午”。接着从“午”上顺掐5位(5为甲、乙、丙、丁、戊5位),得“戌”位即“戊戌”干支。此年柱。 月柱,年干“戊”,“壬子”起,这也无须记,也可以掐指,在左手上,大拇指在“甲己”位上念“甲乙”,顺推,到“戊”上为“壬”。所以“壬子”起,到“卯”为“乙卯”。此月柱。 日柱,干从"庚"顺数,第9位为"戊",余2,所以是"戊的相合干"癸".支从"子"数,依次为"子"、“酉”、“午”、“卯”第9位还为“子”,因为余2,下一步,“子”冲“午”前一位为“巳”。所以得“癸巳”。然后从“癸”起数9位为“辛”,从“巳”起9位为“丑”。所以,日柱为“辛丑”。 时柱,我想大家都会吧,早8为辰时,日起时法,“子”上数“戊”到“辰”为“壬”,即“壬辰”时。 好了,四柱为:戊戌乙卯辛丑壬辰。 这是个例操作过程,不是通用方法。掌握通用方法,熟练后,比查万年历要快。因为有些步骤大脑可以快速跳过。瞬间得到结果。 本人看过多种掐指算干支的秘籍,其实都要大量背一些口诀,并不诀,而这种方法,只需记住两个数,进行一次简单的两位数减法运算(心算完全可以做到),和一次两位除一位数的除法运算(心算完全可以做到)外,完全是掐指得到的结果。

万年历说明书

万年历说明书 2、定闹的设置:按“D”键,进入定闹的设置,月数码管位置显示定闹序号,序号闪烁,按“B”或“C”键,可选择定闹1~4中的某个设置;再按“D”键时闪烁,按“B”或“C”键其调整为设置值;再按“D”键分闪烁,按“B”或“C”键其调整为设置值;再按“D”键,在日数码管位置显示“on”或“--”的定闹状态并闪烁,,按“B”或“C”键,关闭或开启此定闹,再按“D”键,退出定闹的设置。注:4个定闹中只要有1个或1个以上的定闹状态设置为开启,定闹指示灯即亮,只有所有定闹的状态都为关闭时,定闹指示灯才灭。 3、整点闹铃的设置:在正常运行状态下,按一下“B”键,面板上的整点闹指示灯“亮”表示整点闹铃已开启,反之,灯“灭”为关闭。 数码万年历使用说明书 作者pupaishop浏览213发布时间11/09/24 1.按键阐明:报时/退出键、设置键、上调键、下调/定闹键、流水键、模式/定闹键(模式键只在选为倒计天或逆计天才有)。 2.时光调剂: ①反常走时状态下,按“设置”键进进时间设置状态,同时暮年份“闪

耀”,可按“上调”或“下调”键建改暮年份,修正佳先按“设置”键将闪烁位移到公历“月”,按“上调”或“下调”键建改月份;用同样的方式可对于日、时、分、秒入止设置;12个公历节日及正计地数、24个农历节气及正计天数、12生肖、12星座、礼拜、工历月、日将自静追随母历的变更。 ②该秒设定佳先,再按“设置”键退出时间设置,归到正常时间状态。 3.12/24小时制切换: 在反常走时状态,按住“上调”键3秒钟,则可进止12小时制取24小时造的切换。 下电单位时,否默以为24大时造或者12大时造,由选项决议。4.启/闭零面报时: 在正常走时状态,按一下“上调”键,则可以挨开整点报时指导灯和整点报时功能;按一下“上调”键,则可以关关整点报时指导灯战整点报时功能。 5.地数正计时或逆计时(由选项决议) 在正常时间状态下,按“模式”键进入“天数计时状态”,在温度位显示“d1”,计时天数位若显示“????”,表示计时“无效”;若显示详细数字表示有效,按“上调”键可以切换“有效”/“无效”,按“设置”键进入天数设定,且右边第一位(千位)闪烁,按“上调”或“下调”键修改内容,按“设置”键挪动闪烁位置到第两位(百位),按“上调”或“下调”键修改闪烁位的内容,同样方式可设置十位取个位。

万年历计算方法

万年历计算方法 1。平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。 由于公元1月1日设为星期六,故3月1日为星期三。——注意这个“三” 为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。 2。每400年整一闰,或每4年且不为百年的一闰。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。但四年加一天又多用了44分56秒,这个数积满400年为三天。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。) 所以百年%4=0闰或(年%4=0并且年<>0)闰。 3。每 4年(3个平年+1个闰年)共208周+5天——注意这个“5天” 每百年共100*(208周+5天)-1天=5217周+5天——注意这个“5天”(整百年暂设为平年) 每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和 “1天”(4个整百年只有一个闰年) 即400年一轮回!(原来万年历400年前是一家) 蔡勒(Zeller)公式 历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的蔡勒(Zeller)公式 即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。) 算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。 以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下: 蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1

日期计算法

日期计算法 第一种情况: 已知某月1日为星期a,求同月某b日为星期几? 计算公式: (b-1)÷7=c(周数)……a(余数), a(余数)+b(已知星期数)=d(所得星期数) 则a+b所得结果则为要求的b日星期数,假如a+b大于7时,为方便计算,则a+b-7所得数为星期几 例如:已知6月1日为星期三,求6月18日为星期几? 求6月28日为星期几? 求6月29日为星期几? 解1:(18-1)÷7 =2……3 , 3(星期三)+3(余数)=6, 所得结果6则为星期六, 解2:(28-1)÷7 =3……6, 3(星期三)+6(余数)-7=2, 所得结果2则为星期二, 解3:(29-1)÷7 =4……0, 3(星期三)+0(余数)=3, 所得结果3则为星期三, 第二种情况 已知某月a日为星期b,求当月1号为星期几? 计算公式:(a-1) ÷7=c(因数)……d(余数), b(已知星期数)-d(余数)=e, e则为需要求的星期数,当b

解(21-1)÷7 =2.......6, 因星期数2小于余数6,所以需要加上周的进率7, 所以为7(一周7天进率)+2(已知星期数)-6(余数)=3, 所得结果3则为星期三. 例:6月19日为星期日,求6月1日为星期几? 解(19-1)÷7 =2……4, 7(已知星期数)-4(余数)=3, 所得结果3则为星期三. 例:6月15日为星期三,求6月1日为星期几? 解(15-1)÷7 =2……0,则3(已知星期数)-0(余数)=3, 所得结果3则为星期三 如果知道某月的某天为星期几,求当月的另一天为星期几,则综合上述方法, 先算出某月的1号为星期几,再算要求的那天为星期几 例:已知6月20日为星期一,求6月30日为星期几? 解: (20-1)÷7=2......5, 7+1-5=3 (得出6月1日为星期三) (30-1)÷7=4......1, 3(上一步算出6月1号的星期数)+1(余数)=4 (得出6月30日为星期四)

日期计算器

程序设计与算法课程设计

课程设计评语 对课程设计的评语: 平时成绩:课程设计成绩: 总成绩:评阅人签名: 注:1、无评阅人签名成绩无效; 2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效; 3、如有平时成绩,必须在上面评分表中标出,并计算入总成绩。

目录 课程设计评语 (2) 目录 (3) 1.课程论文题目.............................................................................................. 错误!未定义书签。2.程序设计思路.. (4) 3.功能模块图 (4) 4.数据结构设计 (5) 5.算法设计 (5) 6.程序代码 (6) 7.程序运行结果 (7) 8.编程中遇到的困难及解决方法.................................................................. 错误!未定义书签。9.总结及建议.................................................................................................. 错误!未定义书签。10.致谢. (8)

1.课程设计题目:日期计算器 【要求】 功能:计算输入日期是当年中的第几天 系统要求实现以下功能: 1. 由用户分别输入:年、月、日 2. 计算该日期是当年中的第几天 3. 输出计算出的天数 分步实施: 1、首先设计Dater对象构造器 2、判断此年是否为闰年。 3、计算从此年年初到此日的一共多少天 4、输入输出处理。 【提示】 需求分析:使用Dater对象构造器,用1判断为闰年,,0判断为不是闰年,使用累加的方法计算年初到此日共有多少天,进行输入输出处理. (1)主函数设计 主函数提供输入,处理,输出部分的函数调用。 (2)功能模块设计 模块:由用户自己录入年,月,日,、。计算该日期为一年的中德第几天。输出计算出的天数,返回主菜单。 3. 功能模块图 (1)输入模块 由用户分别输入:年、月、日

万年历算法全集

万年历算法全集 程序匠人发表于 2006-3-31 19:39:00 阅读全文(3135) | 回复(1) | 引用通告(1) | 编辑万年历全集 程序可以实现如下三种功能: 求某个日期对应的星期 求某年某月有的天数 输出某年的日历. 例如,打印2006年日历如下: -------------------------------------------------------------------------- 2006 年 -------------------------------------------------------------------------- 一月二月 周日周一周二周三周四周五周六周日周一周二周三周四周五周六 1 3 5 7 9 11 13 1 3 5 7 14 15 16 17 18 19 20 8 9 10 11 12 13 14 21 22 23 24 25 26 27 15 16 17 18 19 20 21 28 29 30 31 22 23 24 25 26 27 28 三月四月 周日周一周二周三周四周五周六周日周一周二周三周四周五周六 1 3 5 7 1 8 9 10 11 12 13 14 2 3 4 5 6 7 8 15 16 17 18 19 20 21 9 10 11 12 13 14 15 22 23 24 25 26 27 28 16 17 18 19 20 21 22 29 30 31 23 24 25 26 27 28 29 30

五月六月 周日周一周二周三周四周五周六周日周一周二周三周四周五周六 1 3 5 7 9 11 1 3 5 12 13 14 15 16 17 18 6 7 8 9 10 11 12 19 20 21 22 23 24 25 13 14 15 16 17 18 19 26 27 28 29 30 31 20 21 22 23 24 25 26 27 28 29 30 七月八月 周日周一周二周三周四周五周六周日周一周二周三周四周五周六 1 1 3 5 7 9 2 3 4 5 6 7 8 10 11 12 13 14 15 16 9 10 11 12 13 14 15 17 18 19 20 21 22 23 16 17 18 19 20 21 22 24 25 26 27 28 29 30 23 24 25 26 27 28 29 31 30 31 九月十月 周日周一周二周三周四周五周六周日周一周二周三周四周五周六 1 3 1 3 5 7 9 11 13 4 5 6 7 8 9 10 14 15 16 17 18 19 20 11 12 13 14 15 16 17 21 22 23 24 25 26 27 18 19 20 21 22 23 24 28 29 30 31 25 26 27 28 29 30

万年历算法

万年历算法 程序匠人发表于 2006-11-28 22:43:00 阅读全文(763) | 回复(1) | 引用通告(0) | 编辑 万年历算法 一、阳历算法 具体算法见函数Void get_solar_day_date(void),这样阳历日历的星期排法就确定了。 表1: 月份 1 2 3 4 5 6 7 8 9 10 11 12 闰年 31 29 31 30 31 30 31 31 30 31 30 31 非闰年 31 28 31 30 31 30 31 31 30 31 30 31 变量定义: Public: Unsigned int temp_total_day; Unsigned char gc_solar_calendar_year; Unsigned char gc_solar_calendar_month; Unsigned char gc_solar_calendar_date; Unsigned char gc_lunar_calendar_year; Unsigned char gc_lunar_calendar_month; Unsigned char gc_lunar_calendar_date; Unsigned char start_day_of_week; 说明:函数get_solar_day_date(void)的输入变量:gc_solar_calendar_year和gc_solar_calendar_month 输出变量:start_day_of_week和temp_total_day Void get_solar_day_date(void) { unsigned char temp01; /*------calculate what day is the day of the current month and year. Mon~Sun?---*/ /*条件初始化二次,减少运算数据量. temp_total_day 是int型变量*/ start_day_of_week = 2; temp_total_day = 0;calculate_temp = 1; if(gc_solar_calendar_year > 99) {start_day_of_week = 6;calculate_temp = 100;} for(temp01 = calculate_temp; temp01

相关文档
最新文档