历法计算


简介

网上有很多计算历法的程序库。为了提高运算速度,我将其中一个Java程序库的部分内容改写成C/C++程序(caldll.dll),同时写了两个小工具caltest和WinCal。关于历法的背景知识可以查看我的文章 中的时标和历法

说明

农历数据是以天文数据为基础,按照历法规则计算产生的。网上一般的万年历程序,为了避免复杂的计算,都通过查表法实现。我写caltest的初衷,也是为了产生查表法需要的数据,或者作为万年历程序的测试程序使用。不过这里的caltest还没有实现它的初衷,它只是一个例子,演示了历法库caldll的使用。caltest的使用方法可以通过在命令行键入“caltest /?”看到。

WinCal是一个很简单的万年历,在Windows环境运行。我大概用了两个小时完成,以后在使用时又改正了一些bug。WinCal的特点是它通过计算产生历法数据,所以它是真正意义上的万年历。WinCal目前可以显示农历日期、节气、年、日的干支、儒略日、简化儒略日等信息。

TO-DO

可以为caldll和WinCal增加儒略历、回历等功能,但目前还没有发现这方面的需求。

下载

下载caltest和WinCal的可执行文件

下载caltest的源文件

下载WinCal的源文件

更新说明

  • 2005-12-12 纠正caldll的bug。caldll的算法改写自java代码。在java中byte是有符号的,我改写成C++时误以为byte无符号,所以出错。多谢网友阿勇的指正。

caldll源代码

Caltest和WinCal都使用了一个动态链接库caldll。caldll有以下功能特点:

  1. 使用caldll可以计算农历日期、节气、年、日的干支、儒略日、简化儒略日等信息。
  2. caldll是C风格代码,其中可以方便地移植到嵌入式平台。
  3. 使用caldll可以计算出查表法需要的数据。
  4. caldll不仅提供了农历计算功能,它还提供了很多方便的公历相关函数。例如计算公历日期是一年中的第几天,在公历日期和绝对天数间相互转换等。将公历日期转换到绝对天数后,可以方便地进行计算

大家可以直接使用caldll,而不关心其内部实现。如果有的朋友确实需要caldll的源代码,可以通过淘宝网购买:

购买caldll的源代码

 

个人主页留言本我的空间随笔集 fmdd@263.net