**********************************************************************
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 年月日时的天干地支
------------------------
中国采用天干地支计法来计年月日时,十天干十二地支循环配成六十花甲再轮排,年月日时都有和其对应的干支。计算年月日
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
CnPack IDE Wizards (CnWizards) is a Free Plug-in Tool Set for Delphi/C++ Builder/CodeGear RAD Studio to Improve Development Efficiency. For main functions see Screen Snap. CnPack Component Package (CnVCL) includes non-visual, UI, Net Comm and Multi-Language Components in Delphi / C++ Builder. (Under development). CVSTracNT, CVSTrac for Windows, was migrated and is maintained by the CnPack Team. It is a A Web-Based Bug And Patch-Set Tracking System for CVS under Windows. The original version was developed by D. Richard Hipp.
资源推荐
资源详情
资源评论
收起资源包目录
CnPack 0.9.5.554 + Source (306个子文件)
CleanInplace.bat 827B
Head.bmp 5KB
WaterImage.cfg 666B
SkinMagicDemo.cfg 666B
CnInetDemo.cfg 658B
UDPDemo.cfg 658B
ProjectModem.cfg 658B
CnASDemo.cfg 626B
OutPut.cfg 618B
AdvancePro.cfg 602B
PackerDemo.cfg 578B
FileSystemWatcherTest.cfg 576B
AutoOption.cfg 574B
Project1.cfg 574B
TestCal.cfg 574B
CnEditDemo.cfg 574B
Project1.cfg 574B
Project1.cfg 574B
Project1.cfg 574B
Demo.cfg 570B
Project1.cfg 570B
PODO.cfg 491B
AntiCheater.cfg 486B
Project1.cfg 486B
ColorGridDemo.cfg 386B
Project1.cfg 386B
CnConsoleTest.cfg 386B
Project1.cfg 386B
Unit1.dfm 129KB
frmMain.dfm 56KB
Unit1.dfm 52KB
MainForm.dfm 47KB
Unit1.dfm 38KB
Main.dfm 15KB
UnitOutput.dfm 8KB
Unit1.dfm 8KB
MainFrm.dfm 6KB
Unit4.dfm 6KB
Unit1.dfm 6KB
frmAddOrEdit.dfm 5KB
Unit1.dfm 5KB
Test.dfm 4KB
frmViewResearch.dfm 4KB
frmViewWarning.dfm 4KB
UDPDemoFrm.dfm 4KB
frmMain.dfm 4KB
Unit1.dfm 3KB
uFrmModem.dfm 3KB
CnPODOFormMain.dfm 3KB
uMain.dfm 3KB
Unit1.dfm 3KB
Unit1.dfm 2KB
Unit1.dfm 2KB
frmAddResearch.dfm 2KB
frmAddWarning.dfm 2KB
UMain.dfm 2KB
Unit1.dfm 2KB
Unit1.dfm 2KB
CnDialUpDemo.dfm 2KB
AntiCheaterTest.dfm 2KB
Unit1.dfm 2KB
UfrmMain.dfm 1KB
Unit1.dfm 1KB
Unit1.dfm 1KB
Unit2.dfm 1KB
Unit3.dfm 1KB
Unit2.dfm 1KB
Mainfrm.dfm 990B
Unit1.dfm 953B
Unit1.dfm 931B
Unit1.dfm 867B
DockWindow.dfm 829B
Unit2.dfm 618B
Unit1.dfm 488B
CnDock_____ل___ك_______ل.doc 887KB
CnPack___ش___ف_ل___ي_·____.doc 207KB
CnPackDHibernate_ي_·____.doc 201KB
CnDebugger_____ي_·____.doc 155KB
CnPack_______ل___ي_·____.doc 153KB
CnPack_ث___ل___ي_·____.doc 153KB
CnPack_ض_ي_ل_______ز_ك_______ل.doc 145KB
CnPack_ض_ي_ل___ي_·____.doc 134KB
CnSkin_____ل___ك_______ل.doc 103KB
CnPack_ز_ت____.doc 97KB
CnDebugger_ك_ٍ_ن_ك_______ل.doc 82KB
CnPack_ز_ت_ل_______ط.doc 71KB
CnTimer_ل___ك_______ل.doc 66KB
CnPack_س_µ________.doc 56KB
CnPack_°_ق_ل___ي_·____.doc 49KB
2002_م9__15_____ر___ط_ط_ل___ز.doc 47KB
2003_م10__11_____و___ط_ل___ز.doc 42KB
Delphi_ز_ت___خ_______ظ.doc 41KB
CnASDemo.dof 3KB
AAFont.dof 3KB
Project1.dof 2KB
AutoOption.dof 2KB
OutPut.dof 2KB
UDPDemo.dof 2KB
Project1.dof 1KB
Project1.dof 1KB
共 306 条
- 1
- 2
- 3
- 4
资源评论
- tohaerok2012-09-14刚开始使用很不习惯 满屏彩条...现在好了 很方便
Keshtkar1
- 粉丝: 3
- 资源: 122
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功