- 浏览: 40521 次
- 性别:
- 来自: 北京
最新评论
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 + % 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 + % 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 代表你要计算年干支的那一公历年。
年柱交界点为立春。
中国古代的一种纪年法。即以甲、乙、丙、丁、戊、己、庚、辛、壬、癸为十干,子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥为十二支,把干、支顺序配合。如甲子、乙丑等,经过六十年又回到甲子。周而复始,循环不已。我国农历现仍沿用干支纪年。
本文中,我将计算公历某年某月某日某时的干支称为排四柱(该名称来源于传统的命理算卦)。
本文中将现行公历和格里高利历理解为同一种立法。
由于干支纪年法是以 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 + % 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 + % 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 代表你要计算年干支的那一公历年。
年柱交界点为立春。
发表评论
-
用天文方法计算日月合朔(新月)
2012-12-15 09:09 1652中国农历的朔望月是农历历法的基础,而朔望月又是严格以日月合朔发 ... -
用天文方法计算二十四节气
2012-12-15 09:08 2448二十四节气在中国古代历法中扮演着非常重要的角色 ... -
Positional Astronomy
2012-12-10 05:49 862http://www.jgiesen.de/elevaz/ba ... -
Ephemeris trail
2012-07-13 14:46 844http://www.astrosurf.com/jephem ... -
de406行星历表的结构
2012-07-12 17:14 1689以下 header.405 KSIZE= 2036 NC ... -
DE405/406星历表算法
2012-07-12 17:16 7125#pragma hdrstop #pragma argsuse ... -
农历24节气算法
2012-07-12 17:16 2581许剑伟 [摘要] 古老而 ... -
万年历计算之节气
2012-06-29 14:35 1988一、基本知识 二 ... -
行星的位置计算
2010-11-20 17:25 3799许剑伟 莆田十中 [摘 ...
相关推荐
插件应能计算出任何公历日期对应的天干地支。 2. **星座**:根据出生日期,插件能确定对应的西方星座(如白羊座、金牛座等)。星座的划分基于黄道十二宫,每个星座日期范围固定。 3. **节气**:中国传统农历的24...
干支是古代中国用来记录年、月、日、时的一种方法,由十天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和十二地支(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)组成,它们相互组合,形成60种不同的组合,即...
桌面日历/万年历/农历/记事/便签/提醒/生日管理/节假日,专业的桌面日历工具,可方便查看万年历,农历日历查询,以及传统节日。芝麻日历还可以添加记事,桌面便签,备忘录,生日管理,日期计算,密码管理,在线插件,...
总之,这个MySQL万年历数据库集成了中国传统的农历、节气、天干地支和现代的星座等元素,为开发者提供了强大的日期和时间信息处理能力,适用于多种场景,无论是学术研究、软件开发还是日常生活查询。
"ChineseCalender方法"可能是这个万年历源码中用于处理日期和农历转换的核心方法,它可能包含了上述提到的多种功能,如获取日期、转换阴历、计算天干地支等。理解并优化这个方法对于改进整个万年历程序的性能和准确...
万年历显示查询是一个涉及到中国传统农历与阳历计算、节气变化以及天干地支转换的重要功能。在IT行业中,实现这样的系统需要深入理解日期时间处理、算法设计以及可能涉及的多语言支持。以下是对这一主题的详细阐述:...
- **干支历**:是中国特有的历法,结合天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和地支(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)来标记年、月、日和时。 在MATLAB中,实现这些转换的关键在于精确...
天干地支的组合可以表示年、月、日和时,计算时需要考虑到干支的循环性和闰年的调整。 在实现这个程序的过程中,开发者可能使用了循环、条件判断、数组操作等基本编程技巧。为了提高用户体验,还可能加入了用户界面...
本篇将深入探讨如何利用C#来实现一个功能丰富的万年历程序,涵盖农历、节日、24节气、星座、诞生石、当前时间的时钟显示、生肖以及天干地支等多个方面。 首先,我们需要理解万年历的基本结构。万年历通常包括公历和...
《基于AT89C51的万年历》是一个典型的微控制器应用项目,它利用了C语言编程,结合Proteus仿真技术,实现了一个能够显示阳历、阴历、星期、天干地支以及节气的多功能时钟系统。在这个项目中,AT89C51是一款广泛应用的...
【Android 万年历源码】是一个专门为Android平台设计的日历应用源代码,它提供了查看多年日期的功能,从古代到未来,覆盖了广泛的日期范围,因此被称为“万年历”。这个源码对于开发者来说,是一个学习和理解Android...
黄历则包含了宜忌、天干地支等传统文化元素,对于了解中国传统习俗和择吉日具有参考价值。这里提到的万年历有四种形式:exe(可执行文件)、swf(Flash动画文件)和htm(HTML网页),这使得它们可以在不同平台和环境...
HTML结合JavaScript可以计算出指定公历日期对应的天干地支,并在相应位置显示。 为了让日历更详细,还可以添加节日和节气的信息。这通常需要编写JavaScript代码来处理,根据公历日期查找对应的节日,然后在对应的...
《C语言实现的万年历程序详解》 在信息技术领域,编程语言是构建软件的基础工具,而C语言作为其中的经典代表,因其高效、灵活和强大的系统级编程能力,被广泛应用于各种项目。本文将深入探讨一个用C语言编写的...
例如,`lunar-java`库可以帮助我们计算干支纪年和生肖。干支纪年是由天干(甲、乙、丙、丁、戊、己、庚、辛、壬、癸)和地支(子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥)组成,每60年一轮回。生肖则是按照...
在信息技术领域,日历系统是常见的应用之一,而万年历系统更是因其覆盖时间范围广泛、功能全面而受到广泛关注。本篇文章将深入探讨一个用C++编程语言编写的万年历系统,通过对源码的解析,帮助读者理解其中的关键...
5. **八字**:在中国传统文化中,八字(即年、月、日、时的天干地支组合)用于推算个人命运和吉凶。应用提供八字查询,对于热衷于传统文化的人群,可以方便地查看自己的八字信息。 6. **时钟**:时钟功能不仅提供...
- **GanZhiStartYear** 和 **GanZhiStartDay**:用于干支纪年的计算。 - **HZNum**:用于汉字数字的表示。 - **AnimalStartYear**:用于生肖的计算。 这些基础数据的定义确保了程序在处理农历时能够准确无误。 ###...
万年历是一种能够跨越多个世纪的日期计算工具。它不仅可以提供公历(格里高利历)的日期,还可以显示农历日期、节气等与传统中国文化相关的日期信息。对于需要频繁查询特定日期的用户来说,万年历是非常有用的工具。...