陽歷到陰歷的轉(zhuǎn)換

字號:

/*
    西歷農(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 */