/*
西歷農(nóng)歷轉(zhuǎn)換程式
prototype: int CalConv( struct ConvDate * );
struct ConvDate
{
int Source; ==0 則輸入日期為西歷, !=0 則輸入為農(nóng)歷
int SolarYear; 輸出或輸入之西歷年份
int SolarMonth; 西歷月
int SolarDate; 西歷日
int LunarYear; 輸出或輸入之農(nóng)歷年份
int LunarMonth; 農(nóng)歷月
int LunarDate; 農(nóng)歷日
int Weekday; 該日為星期幾 ( 0==星期日, 1==星期一, ... )
int Kan; 該日天干 ( 0==甲, 1==乙, ..., 9==癸 )
int Chih; 該日地支 ( 0==子, 1==丑, ..., 11==亥 )
};
呼叫時須設(shè)定 Souce 的值, 若為 0 則為西歷轉(zhuǎn)農(nóng)歷, 否則為農(nóng)歷轉(zhuǎn)西歷. 然後視輸入為西歷或農(nóng)歷來設(shè)定西歷或農(nóng)歷的年月日. 轉(zhuǎn)換後的年月日會填入結(jié)構(gòu)中( 農(nóng)歷或西歷 ), 以及該日為星期幾, 天干地支.若函式的返回值為 0 表示沒有錯誤, 1 為輸入之年份錯誤, 2 為輸入之月份錯誤,3 為輸入之日期錯誤.
輸入之西歷年須在 1937 - 2031 間
輸入之農(nóng)歷年須在 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 日到農(nóng)歷正月初一的累積日數(shù) */
int Intercalation; /* 閏月月份. 0==此年沒有閏月 */
int BaseWeekday; /* 此年西歷 1 月 1 日為星期幾再減 1 */
int BaseKanChih; /* 此年西歷 1 月 1 日之干支序號減 1 */
int MonthDays[13]; /* 此農(nóng)歷年每月之大小, 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 */
西歷農(nóng)歷轉(zhuǎn)換程式
prototype: int CalConv( struct ConvDate * );
struct ConvDate
{
int Source; ==0 則輸入日期為西歷, !=0 則輸入為農(nóng)歷
int SolarYear; 輸出或輸入之西歷年份
int SolarMonth; 西歷月
int SolarDate; 西歷日
int LunarYear; 輸出或輸入之農(nóng)歷年份
int LunarMonth; 農(nóng)歷月
int LunarDate; 農(nóng)歷日
int Weekday; 該日為星期幾 ( 0==星期日, 1==星期一, ... )
int Kan; 該日天干 ( 0==甲, 1==乙, ..., 9==癸 )
int Chih; 該日地支 ( 0==子, 1==丑, ..., 11==亥 )
};
呼叫時須設(shè)定 Souce 的值, 若為 0 則為西歷轉(zhuǎn)農(nóng)歷, 否則為農(nóng)歷轉(zhuǎn)西歷. 然後視輸入為西歷或農(nóng)歷來設(shè)定西歷或農(nóng)歷的年月日. 轉(zhuǎn)換後的年月日會填入結(jié)構(gòu)中( 農(nóng)歷或西歷 ), 以及該日為星期幾, 天干地支.若函式的返回值為 0 表示沒有錯誤, 1 為輸入之年份錯誤, 2 為輸入之月份錯誤,3 為輸入之日期錯誤.
輸入之西歷年須在 1937 - 2031 間
輸入之農(nóng)歷年須在 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 日到農(nóng)歷正月初一的累積日數(shù) */
int Intercalation; /* 閏月月份. 0==此年沒有閏月 */
int BaseWeekday; /* 此年西歷 1 月 1 日為星期幾再減 1 */
int BaseKanChih; /* 此年西歷 1 月 1 日之干支序號減 1 */
int MonthDays[13]; /* 此農(nóng)歷年每月之大小, 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 */