**********************************************************************
CnPack For Delphi/C++Builder
中国人自己的免费第三方开发包
(C)Copyright 2001-2009 CnPack 开发组
**********************************************************************
CnCalendar 历法说明
Revision 1.0.1.3
=========================
作者:刘啸 2006.01.05
更新: 2008.04.18
======================================================================
1. CnCalendar 介绍
======================================================================
CnCalendar 是 CnPack 开放源码组件包中的一部分,旨在为国内外程序员尤其是 Delphi/C++Builder 程序员提供一开放源码的历法计算工具包,此包涵盖了公历农历节气干支阴阳五行生肖星座数九三伏出梅入梅日出日落等各个方面,虽然力求做到完整精确,但历法本身的复杂性和天文现象的不确定性决定了这里的计算不会太完善。为了给用户一个完整的使用说明以及使用户在发现问题时能通过阅读 CnCalendar 的代码解决问题,这里将 CnCalendar 的历法算法说明整理如下文。
======================================================================
2. CnCalendar 算法说明
======================================================================
本节对 CnCalendar 所使用的算法进行了详细说明,欢迎阅读并指出谬误之处。
----------------------------------------------------------------------
2.1 概念与常识介绍
----------------------------------------------------------------------
进行历法计算前,有一些概念是需要首先明确的,包括历法本身的概念、部分天文名词、公历年、月、日、时的定义等,CnCalendar 算法中所涉及的概念都会在本节中加以说明。值得一提的是,部分概念是属于天文现象、部分则是历法推演而来,一般根据前者修正后者。前后两者拟合的精确度,是评判历法准确与否的依据。
2.1.1 阳历、阴历、阴阳历
------------------------
太阳和月亮是对人类生产活动影响最大的两个天体,因此历法基本上都是以日和(或)月的运行规矩为依据来计算的,纯粹以太阳的运行规律来计算的历法称为阳历,纯粹以月亮来计算的则称为阴历,两者兼而有之的自然就是阴阳历了。公历是典型的阳历,回历是阴历(本文未涉及),中国的农历则是阴阳历。
2.1.2 历理的依据
----------------
历法的作用有两个,一是能精确计时(或者说是计日),二是要符合实际情况。这个实际情况包括很多内容,如季节更替、农耕活动、潮汐涨落等。实际情况造就了历法,历法反过来又应当能根据其规则去推演实际情况,这便是历法的最终目的。目前通用的公历是 1582 年制定的格里高利历(Gregorian),它在前身儒略历(Julian)的一年 365 日、四年一闰的基础上增加了百年不闰、四百年又闰的规矩,形成了现在的通用公历历法。格里高利历是以数值计算为历理依据的,换句话说,按照格里高利历的数值计算规则,可以往前后推任意多的天数而计算出当时的公元年月日来,至于是否符合实际情况,则只有到时候瞧着办了。像格里高利历的前身儒略历就出现过硬算下去误差积累导致春分日提前 10 天的事故,不过令人放心的是,太阳与地球的相对活动情况比较稳定,儒略历只是拟合得不甚精确,而修改后的格里高利历的精确度提高了许多,至少能支持三千年(如果加上四千年又不闰的规则则可以撑几万年了)。这也说明,只要历法所根据的天文情况比较固定,历法就可能推演成简单数值计算的公式。公历正是如此。
中国的农历计月所依据的是月亮的运行规则,月亮的不稳定度比太阳高得多,而农历是天文历法,其原则规定了以实际情况为准、数值计算为辅,所以导致了中国历史上的多次修历,更导致了目前农历计算和公农历转换的复杂性。而且农历这个阴阳历还必须考虑到太阳周期(回归年)和月亮周期(阴历月)的配合,更产生了十九年七闰的规则,而闰月的确定还需要以节气为准,大大增加了计算的复杂度。后文会详细说明。
2.1.3 春分点,回归年,阴历年
----------------------------
地球是斜着绕太阳转的,所以赤道面和黄道面有个固定的夹角,这个夹角在地球公转过程中导致了太阳直射点在南北回归线间移动,因此造就了四季更替、形成了年的概念。注意年的概念比发现地球绕太阳转要久远得多,年对古人的直观感受就是四季更替和春种秋收,这个感受和地球是否公转是无关的。假想如果地球光自转不公转而太阳在垂直于黄道面的方向上来回移动,同样也能造就年的感受。——说明这点的目的是为了区分下面所描述的概念:恒星年和回归年。
地球精确绕太阳转一周的时间称之为恒星年,而四季更替的精确时间称之为回归年。那么怎样衡量四季更替的精确时间?这就要用到春分点的概念。春分点是天文概念,它是黄道面上的地球公转轨道和赤道面的两交点之一(另一个自然是秋分点了),春分秋分点时太阳正好直射赤道,而太阳的直射又正好符合四季更替的感受要求,因此回归年的定义就是地球从这个春分点转一圈又回到春分点的时间。
如果春分点不动,恒星年就等于回归年,因为地球转一圈又回来了。遗憾的是地轴总会像陀螺一样有进动和章动,所以导致的岁差会让春分点在一年中稍微前进一点点,因此一恒星年比一回归年要长那么一点点,一个是 365.25636 日,一个是 365.2422 日。记住,回归年才是我们通常概念中的年。
也许有人要问,恒星年和回归年有 20 多分钟的差距,长此累积下去会有什么影响?答案是“和历法无关”。历法中本来就不管地球在公转轨道上的位置,春分点秋分点的平分——冬至点和夏至点也和公转轨道上的近日点远日点没什么必然关系,所以关心恒星年和回归年的差距是天文学家的事情。太阳历的基础就是回归年。
至于阴历年,则没有什么天文意义,只是月的集合而已,不过在农历这个阴阳历中,它也得拟合回归年的长度。一农历年是从正月初一到次年正月初一前的时间,它可能包含 12 或 13 个月,取决于闰年的设定。
农历中还有“岁”的概念,是从冬至日到次年冬至日之间的时间,等于一回归年。这个概念用来计算闰月。
2.1.4 阳历月,农历月,月朔
--------------------------
阳历月同样没有什么天文现象和它对应,设置阳历月只是为了便于把年分割计时,所以儒略历时能随便将月份的日期调大调小,只要保持一年的天数不变就行。像七八月连大、二月特小等都是历史上遗留下来的问题。
农历月则不同,农历的月是阴历月,反映了月相的变化,也就是月球绕地球公转一周的周期。农历规定了月朔时的那日为农历月首初一,下个月朔时为下个月月首初一。由于月球的公转周期差不多是 29.5 天但月必须是天的整数倍,因此农历月有大有小,大月 30 天,小月 29 天,而且也间隔得无规律可循,也就是说没法在不参考月相又脱离年份的情况下直接算出某个农历月的大小来,这一点和公历是不同的。
关于月朔也有说明:朔是日月黄经相等的时刻,但由于太阳和月亮运行的不均匀性,导致每两个相邻月朔之间的时间都不相等,中国唐初以前的农历采用的是经过长期观测统计求得的相邻月朔间的平均时间,将这个平均时间当成一朔望月,由此直接计算而来的各个月朔时刻称之为平朔。而唐初后农历中使用的修正后的比较精确的朔被称为定朔,它们之间是有相对误差的。
2.1.5 日,平太阳日
------------------
日是地球自转带来的昼夜交替,时、分、秒都脱胎于它。以往日的定义是真太阳日,也就是在地面上观测到的太阳视点绕地球一周又回到天球上天顶位置的时间间隔,这个间隔和地球精确自转一周的时间(恒星日)有点差别,因为地球还在公转,位置有点变化,其原理类似于春分日前进导致的回归年和恒星年的差距。另外地球的黄赤夹角以及椭圆轨道上的公转速度不均匀也导致了真太阳日的长短在一年中有所区别,为了消除这个差别,历法中引入了平太阳的概念。“平”在历法中是指时间均匀分布的意思,平太阳则是一个假想的太阳,以均匀的速度在天球赤道上绕地球运动,其速度的精确值为真太阳在一回归年内的平均速度,并且和真太阳同时经过近地远地点,这个平太阳运行一周回到天顶的时间则定义为一平太阳日,也就是现在通常的日的概念。换句话说,地球一年内的自转转速分布和公转情况共同决定了一平太阳日的实际大小。
至于时、分、秒,最初都是由平太阳日的定义衍生而来的:1 平太阳日等分为 24 小时,1 小时等分为 60 分钟,1 分钟等分为 60 秒。而后来由于地球自转不均匀导致的平太阳日的精确度不高,便另起炉灶以其他更精确的手段规定秒的长度,则是以后的事情了。
2.1.6 节气
----------
节气是对一回归年内地球公转轨道上的 24 个具有季节意义的等分位置的描述,这 24 个节气名这里就不赘述了,只是这个“等分”也有说法:中国古代采用平气,按时间等分一回归年,相邻两节气之间时间间隔固定。清代修历后改用定气,等分周天为 24 分,每 15°为一个节气,这样相邻节气的时间间隔由于地球公转速度的变化会有所不同。
24 个节气中包括 12 个节气和 12 个中气,奇数号为节气,存在于每公历月上旬,偶数号为中气,存在于公历月下旬。中气对阴历的闰月计算起着决定性的作用。
本文的节气计算和中国现代农历一样使用定气。而古代使用的平气,其交节时刻和根据定气计算推得的时刻会有较大的误差,计算时应予注意。
2.1.7 年月日时的天干地支
------------------------
中国采用天干地支计法来计年月日时,十天干十二地支循环配成六十花甲再轮排,年月日时都有和其对应的干支。计算年月日
Keshtkar1
- 粉丝: 3
- 资源: 122
最新资源
- 数据结构上机实验大作业-线性表选题.zip
- 字幕网页文字检测20-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 雪毅云划算试客系统v2.9.7标准版 含购物返利+免费试用+9.9包邮+品牌折扣+推广中心等
- 冒泡排序算法详解及Java与Python实现
- 实时 零代码、全功能、强安全 ORM 库 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构
- 混合有源滤波器(HAPF) MATLAB-Simulink仿真 仿真模拟的HAPF补偿前后,系统所含的谐波对比如下图所示
- csi-driver-nfs
- 认识小动物-教案反思.docx
- pdfjs2.5.207和4.9.155
- 2023-04-06-项目笔记 - 第三百五十五阶段 - 4.4.2.353全局变量的作用域-353 -2025.12.22
- OPCClient-UA源码OPC客户端源码(c#开发) 另外有opcserver,opcclient的da,ua版本的见其他链接 本项目为VS2019开发,可用VS其他版本的编辑器打开项目 已应
- 2023-04-06-项目笔记 - 第三百五十五阶段 - 4.4.2.353全局变量的作用域-353 -2025.12.22
- PHP快速排序算法实现与优化
- deploy.yaml
- 家庭用具检测15-YOLO(v8至v11)数据集合集.rar
- RuoYi-Cloud-Plus 微服务通用权限管理系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈