/*
西历农历转换程式
prototype: int CalConv( struct ConvDate * ).
struct ConvDate
{
int Source. ==0 则输入日期为西历, !=0 则输入为农历
int SolarYear. 输出或输入之西历年份
int SolarMonth. 西历月
int SolarDate. 西历日
int LunarYear. 输出或输入之农历年份
int LunarMonth. 农历月
int LunarDate. 农历日
int Weekday. 该日为星期几 ( 0==星期日, 1==星期一, ... )
int Kan. 该日天干 ( 0==甲, 1==乙, ..., 9==癸 )
int Chih. 该日地支 ( 0==子, 1==丑, ..., 11==亥 )
}.
呼叫时须设定 Souce 的值, 若为 0 则为西历转农历, 否则为农历转西历. 然後视输入为西历或农历来设定西历或农历的年月日. 转换後的年月日会填入结构中( 农历或西历 ), 以及该日为星期几, 天干地支.若函式的返回值为 0 表示没有错误, 1 为输入之年份错误, 2 为输入之月份错误,3 为输入之日期错误.
输入之西历年须在 1937 - 2031 间
输入之农历年须在 1936 - 2030 间
若须扩充, 则增加 LunarCal[]
*/
#define FIRSTYEAR 1936 /* The first year in LunarCal[] */
struct ConvDate
{
int Source.
int SolarYear.
int SolarMonth.
int SolarDate.
int LunarYear.
int LunarMonth.
int LunarDate.
int Weekday.
int Kan.
int Chih.
}.
struct tagLunarCal
{
int BaseDays. /* 到西历 1 月 1 日到农历正月初一的累积日数 */
int Intercalation. /* 闰月月份. 0==此年没有闰月 */
int BaseWeekday. /* 此年西历 1 月 1 日为星期几再减 1 */
int BaseKanChih. /* 此年西历 1 月 1 日之干支序号减 1 */
int MonthDays[13]. /* 此农历年每月之大小, 0==小月(29日), 1==大月(30日) */
}.
struct tagLunarCal LunarCal[] = {
{ 23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 }, /* 1936 */
{ 41, 0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 },
{ 30, 7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },
{ 49, 0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 38, 0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 }, /* 1940 */
{ 26, 6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 45, 0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 35, 0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 24, 4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 }, /* 1944 */
{ 43, 0, 0, 5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 },
{ 32, 0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 },
{ 21, 2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 40, 0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 }, /* 1948 */
相关文章
阳历到阴历的转换
GuruoftheWeek#6:正确使用co t
陷阱技术探秘──动态汉化Windows技术的分析
非ROOT用户能访问另一个非ROOT用户的文件
奇怪的返回:ask:ask
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛