//------------------------------------------------------------------------------
//
//单元内容:农历函数中的全局数据、函数的定义
//
//------------------------------------------------------------------------------
//
//程序设计:Enlightenment
//版本代号:1.00.00
//内部版本:1.00.00
//联系方式:[email protected] or
//          [email protected]
//
//共享原则:您可以在自己的程序中使用这些代码而无须另行通知作者,
//          但如果您需要修改代码,请您将修改后的代码发送一份给作者。
//注意事项:您不可以将该程序的代码直接用于商用目的或类似行为(如收费刊登等),
//          如果,确实需要商用转帖,请知会作者。
//
//          谢谢合作!
//------------------------------------------------------------------------------unit Unit_ChineseCalendarConstant;interfaceconst
//农历相关常量>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  //农历中阳历计算的最小年份
  CONST_CHINESECALENDAR_MIN_SOLARYEAR=1901;
  //农历中阳历计算的最大年份
  CONST_CHINESECALENDAR_MAX_SOLARYEAR=2050;  //农历中阴历计算的最小年份
  CONST_CHINESECALENDAR_MIN_LUNARYEAR=-5000;
  //农历中阴历计算的最大年份
  CONST_CHINESECALENDAR_MAX_LUNARYEAR=5000;  //天干地支表
  CHINESECALENDAR_LUNAR_ERASKY:array[0..9]of string[2]=(
      '甲','乙','丙','丁','戊','己','庚','辛','壬','癸');
  CHINESECALENDAR_LUNAR_ERAEARTH:array[0..11]of string[2]=(
      '子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥');
  //十二生肖表
  CHINESECALENDAR_LUNAR_ERAANIMAL:array[0..11]of string[2]=(
      '鼠','牛','虎','免','龙','蛇','马','羊','猴','鸡','狗','猪');  //获取指定公历年份对应的4字节数据中指定的字节数据(byte[0]-byte[3])
  //ID取值范围0-3(本函数未加判断)
  function ChineseCalendar_DataConvert_GetBasicLunarData(
    AYear:integer;ID:integer;var AReturnByte:integer):integer;
//对于列表数据处理的一些基本函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  //获取该年的1月1号对应的农历的月份
  //若最高字节的最高位为1表示为12月,否则为11月  
  //返回-1表示错误,0表示正确
  function ChineseCalendar_DataConvert_GetTheFirstLunarMonth(
    AYear:integer;var AFirstMonthNumber:integer):integer;  //获取该年的1月1号对应的农历的某月的天数的号数
  //若最高字节除去最高位为,该年的1月1号对应的农历的日的值
  //返回-1表示错误,0表示正确
  function ChineseCalendar_DataConvert_GetTheFirstLunarDay(
    AYear:integer;var AFirstDayNumber:integer):integer;  //获取(该年公历对应的农历的顺序中)(指定排列数字的月份的)大(30)或小(29)
  function ChineseCalendar_DataConvert_GetMonthSize(
    AYear:integer;AMonthNumber:integer):byte;  //获取公历月份转换成农历的列表
  function ChineseCalendar_DataConvert_GetMonthList(
    AYear:integer;var MyLeapMonthNumber:integer;
    var MonthNumberList:array of integer):integer;implementationuses
  Unit_ChineseSolarCalendarFunction;
const  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  //数据内容:存储1901年到2050年中农历处理数据
  //数据来源:UCDOS 6.0 UCT.COM
  //数据解析:农历月份数据:每年4字节
  //          如果第一字节的bit7为1,则该年1月1日位于农历12月,否则位于11月;
  //          第一字节去除bit7为该年1月1日的农历日期;
  //>>>>>>>>>>>>>>>>>>>>>>>>>>第二字节>>>>>>>>>>>>>>>>第三字节>>>>>>>>>>>>>>>>>>
  //          bit:     7  6  5  4  3  2  1  0  7  6  5  4  3  2  1  0
  //          农历月份:16 15 14 13 12 11 10 9  8  7  6  5  4  3  2  1
  //          农历月份指的是从该年1月1日的农历月份算起的顺序号;
  //          农历月份对应的bit为1则该月为30日,否则为29日;
  //          第四字节为闰月月份;
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  CHINESECALENDAR_LUNARDATA:array[
    CONST_CHINESECALENDAR_MIN_SOLARYEAR..
    CONST_CHINESECALENDAR_MAX_SOLARYEAR] of longword=(
        $0b52ba00,  //1901
        $16a95d00,  //1902
        $83a93705,  //1903
        $0e749b00,  //1904
        $1ab65500,  //1905
        $87b55504,  //1906
        $1155aa00,  //1907
        $1ca6b500,  //1908
        $8aa57502,  //1909
        $1452ba00,  //1910
        $81526e06,  //1911
        $0de93700,  //1912
        $18749700,  //1913
        $86ea9605,  //1914
        $106d5500,  //1915
        $1a35aa00,  //1916
        $884b6a02,  //1917
        $13a56d00,  //1918
        $1ed26e07,  //1919
        $0bd25e00,  //1920
        $17e92e00,  //1921
        $84d92d05,  //1922
        $0fda9500,  //1923
        $195b5200,  //1924
        $8756d404,  //1925
        $114ada00,  //1926
        $1ca55d00,  //1927
        $89a4bd02,  //1928
        $15d25d00,  //1929
        $82b25b06,  //1930
        $0db52b00,  //1931
        $18ba9500,  //1932
        $86b6a505,  //1933
        $1056b400,  //1934
        $1a4ada00,  //1935
        $8749ba03,  //1936
        $13a4bb00,  //1937
        $1eb25b07,  //1938
        $0b725700,  //1939
        $16752b00,  //1940
        $846d2a06,  //1941
        $0fad5500,  //1942
        $1955aa00,  //1943
        $86556c04,  //1944
        $12c97600,  //1945
        $1c64b700,  //1946
        $8ae4ae02,  //1947
        $15ea5600,  //1948
        $83da5507,  //1949
        $0d5b2a00,  //1950
        $18ad5500,  //1951
        $85aad505,  //1952
        $10536a00,  //1953
        $1ba96d00,  //1954
        $88a95d03,  //1955
        $13d4ae00,  //1956
        $81d4ab08,  //1957
        $0cba5500,  //1958
        $165aaa00,  //1959
        $8356aa06,  //1960
        $0faad500,  //1961
        $1952da00,  //1962
        $8652ba04,  //1963
        $11a95d00,  //1964
        $1dd49b00,  //1965
        $8a749b03,  //1966
        $15b65500,  //1967
        $82ad5507,  //1968
        $0d55aa00,  //1969
        $18a5b500,  //1970
        $85a57505,  //1971
        $0f52b600,  //1972
        $1b693700,  //1973
        $89e93704,  //1974
        $13749700,  //1975
        $81ea9608,  //1976
        $0c6d5200,  //1977
        $162daa00,  //1978
        $834b6a06,  //1979
        $0ea56d00,  //1980
        $1ad26e00,  //1981
        $87d25e04,  //1982
        $12e92e00,  //1983
        $1dec960a,  //1984
        $0bda9500,  //1985
        $155b5200,  //1986
        $8256d206,  //1987
        $0c2ada00,  //1988
        $18a4dd00,  //1989
        $85a4bd05,  //1990
        $10d25d00,  //1991
        $1bd92d00,  //1992
        $89b52b03,  //1993
        $14ba9500,  //1994
        $81b59508,  //1995
        $0b56b200,  //1996
        $162ada00,  //1997
        $8349b605,  //1998
        $0e64bb00,  //1999
        $19b25b00,  //2000
        $876a5704,  //2001
        $12752b00,  //2002
        $1db69500,  //2003
        $8aad5502,  //2004
        $1555aa00,  //2005
        $82556c07,  //2006
        $0dc97600,  //2007
        $1764b700,  //2008
        $86e4ae05,  //2009
        $11ea5600,  //2010
        $1b6d2a00,  //2011
        $885aaa04,  //2012
        $14ad5500,  //2013
        $81aad509,  //2014
        $0b52ea00,  //2015
        $16a96d00,  //2016
        $84a95d06,  //2017
        $0fd4ae00,  //2018
        $1aea4d00,  //2019
        $87ba5504,  //2020
        $125aaa00,  //2021
        $1dab5500,  //2022
        $8aa6d502,  //2023
        $1452da00,  //2024
        $8252ba06,  //2025
        $0da93b00,  //2026
        $18b49b00,  //2027
        $85749b05,  //2028
        $11b54d00,  //2029
        $1cd6a900,  //2030
        $8835aa03,  //2031
        $13a5b500,  //2032
        $81a5750b,  //2033
        $0b52b600,  //2034
        $16693700,  //2035
        $84e92f06,  //2036
        $10f49700,  //2037
        $1a754b00,  //2038
        $876d5205,  //2039
        $112d6900,  //2040
        $1d95b500,  //2041
        $8aa56d02,  //2042
        $15d26e00,  //2043
        $82d25e07,  //2044
        $0ee92e00,  //2045
        $19ea9600,  //2046
        $86da9505,  //2047
        $105b4a00,  //2048
        $1cab6900,  //2049
        $882ad803);  //2050
//对于列表中数据处理的一些基本函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//获取指定公历年份对应的4字节数据中指定的字节数据(byte[0]-byte[3])
//ID取值范围0-3(本函数未加判断)
function ChineseCalendar_DataConvert_GetBasicLunarData(
  AYear:integer;ID:integer;var AReturnByte:integer):integer;
var
  MyLongword:Longword;
begin
  Result:=-1;
  //若年份超出范围则退出
  if ChineseCalendar_Solar_InYearRange(AYear)<>0 then Exit;
  MyLongword:=CHINESECALENDAR_LUNARDATA[AYear];
  if ID<>3 then MyLongword:=MyLongword shr (8*(3-ID));
  AReturnByte:=MyLongword mod $100;
  Inc(Result);
end;//获取该年的1月1号对应的农历的月份
//若最高字节的最高位为1表示为12月,否则为11月
//返回-1表示错误,0表示正确
function ChineseCalendar_DataConvert_GetTheFirstLunarMonth(
  AYear:integer;var AFirstMonthNumber:integer):integer;
begin
  Result:=-1;
  //获取相应年份的字节数据
  if ChineseCalendar_DataConvert_GetBasicLunarData(
    AYear,0,AFirstMonthNumber)=-1 then Exit;
  //若最高位字节为1,则表示该年1月1日位于农历12月,否则为农历11月
  if(AFirstMonthNumber and $80)<>0 then AFirstMonthNumber:=12 else AFirstMonthNumber:=11;
  Result:=0;
end;//获取该年的1月1号对应的农历的某月的天数的号数
//若最高字节除去最高位为,该年的1月1号对应的农历的日的值
//返回-1表示错误,0表示正确
function ChineseCalendar_DataConvert_GetTheFirstLunarDay(
  AYear:integer;var AFirstDayNumber:integer):integer;
begin
  Result:=-1;
  //获取相应年份的字节数据
  if ChineseCalendar_DataConvert_GetBasicLunarData(
    AYear,0,AFirstDayNumber)=-1 then Exit;
  //若最高位字节为1,则表示该年1月1日位于农历12月,否则为农历11月
  AFirstDayNumber:=(AFirstDayNumber and $7f);
  Result:=0;
end;//获取(该年公历对应的农历的顺序中)(指定排列数字的月份的)大(30)或小(29)
function ChineseCalendar_DataConvert_GetMonthSize(
  AYear:integer;AMonthNumber:integer):byte;
var
  //临时存储大小月数据
  MyMonthSizeType:Word;
  MyInt1,MyInt2:integer;
begin
  Result:=29;
  //将第二、三字节传递给整字变量
  if (ChineseCalendar_DataConvert_GetBasicLunarData(AYear,1,MyInt1)=-1)or
     (ChineseCalendar_DataConvert_GetBasicLunarData(AYear,2,MyInt2)=-1) then Exit;
  MyMonthSizeType:=word(MyInt1)shl 8+MyInt2;
  if((1shl(15-AMonthNumber))and MyMonthSizeType)<>0 then Inc(Result);
end;//获取公历月份转换成农历的列表,及返回闰月的月份
function ChineseCalendar_DataConvert_GetMonthList(
  AYear:integer;var MyLeapMonthNumber:integer;
  var MonthNumberList:array of integer):integer;
var
  i:integer;
begin
  Result:=-1; 
  //获取(该年公历对应的农历的顺序中)月份中的闰月的月份
  if ChineseCalendar_DataConvert_GetBasicLunarData(AYear,3,MyLeapMonthNumber)=-1 then Exit;
  //获取该年的1月1号对应的农历的月份
  if ChineseCalendar_DataConvert_GetTheFirstLunarMonth(AYear,MonthNumberList[0])=-1 then Exit;
  //设置公历的各个月份对应农历的月份,各个月份天数等
  for i:=0 to 15 do
  begin
    //若该月为闰月,则设置下月(执行的闰月)对应农历月份临时标记为负数,待下次循环时纠正
    if MonthNumberList[i]=MyLeapMonthNumber then MonthNumberList[i+1]:=-MonthNumberList[i]
    //若上月为闰月,下月标记为闰月值加1
    else
    begin
      //纠正负数,及计算下月数值
      MonthNumberList[i]:=abs(MonthNumberList[i]);
      MonthNumberList[i+1]:=MonthNumberList[i] mod 12+1;
    end;
  end;
  Result:=0;
end;end.

解决方案 »

  1.   

    //------------------------------------------------------------------------------
    //
    //单元内容:提供常用的公历的转换函数
    //------------------------------------------------------------------------------
    //
    //程序设计:Enlightenment
    //版本代号:1.00.00
    //内部版本:1.00.00
    //联系方式:[email protected] or
    //          [email protected]
    //
    //共享原则:您可以在自己的程序中使用这些代码而无须另行通知作者,
    //          但如果您需要修改代码,请您将修改后的代码发送一份给作者。
    //注意事项:您不可以将该程序的代码直接用于商用目的或类似行为(如收费刊登等),
    //          如果,确实需要商用转帖,请知会作者。
    //
    //          谢谢合作!
    //------------------------------------------------------------------------------unit Unit_GregorianCalendarFunction;interfaceuses SysUtils;const
      //公历计算的最小年份
      CONST_GREGORIANCALENDAR_MIN_SOLARYEAR=-5000;
      //公历计算的最大年份
      CONST_GREGORIANCALENDAR_MAX_SOLARYEAR=5000;  //检验输入年份是否在计算范围之内(-5000-+5000)
      //0:在范围之内,-1:不在范围之内
      function GregorianCalendar_InYearRange(AYear:integer):integer;  //检验某个年份是否为闰年
      //0;是闰年;
      //1:不是闰年;
      //-1:输入年份超出范围
      function GregorianCalendar_IsLeapYear(AYear:integer):integer;  //计算一年中最大天数
      //-1:输入年份超出范围
      function GregorianCalendar_MAXDayOfYear(AYear:integer):integer;  //检验月份数值是否在正确范围内
      //True:在范围之内,False:不在范围之内
      function GregorianCalendar_InMonthRange(AMonth:integer):integer;
          
      //计算某年份某月的最大天数
      //-1:输入数据超出范围
      //其它值:为该月份天数
      function GregorianCalendar_MaxDayOfMonth(
        AYear:integer;AMonth:integer):integer;  //计算某年月日后一月的年月
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_IncMonth(
        var AYear:integer;var AMonth:integer):integer;  //计算某年月日前一月的年月
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_DecMonth(
        var AYear:integer;var AMonth:integer):integer;  //计算某年、某月、某日是否在范围之内
      //0:表示正确  
      //-1:输入数据超出范围
      function GregorianCalendar_InDayRange(
        AYear:integer;AMonth:integer;ADay:integer):integer;  //计算某年、某月、某日与2000/1/1相差的天数
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_DayDifferenceTo20000101(
        //输入参数
        AYear:integer;AMonth:integer;ADay:integer;
        //返回天数的差值
        var ADifferent:integer):integer;  //计算某年、某月、某日为星期几
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_WeekDay(
        //输入参数
        AYear:integer;AMonth:integer;ADay:integer;
        //返回星期几(0:星期天,1-6)
        var AWeekDay:integer):integer;  //计算某年月日S(Start)与某年月日E(End)相差的天数
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_DayDifference(
        //输入参数
        AYearS:integer;AMonthS:integer;ADayS:integer;
        //输入参数
        AYearE:integer;AMonthE:integer;ADayE:integer;
        //返回天数的差值
        var ADifferent:integer):integer;  //计算某年月日后一天的日期
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_IncDay(
        //输入、输出参数
        var AYear:integer;var AMonth:integer;var ADay:integer
        ):integer;overload;  //计算某年月日前一天的日期
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_DecDay(
        //输入、输出参数
        var AYear:integer;var AMonth:integer;var ADay:integer
        ):integer;overload;  //计算某年月日前X天的日期
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_IncDay(
        //输入、输出参数
        var AYear:integer;var AMonth:integer;var ADay:integer;
        //日期差值
        ADifferent:integer):integer;overload;  //计算某年月日前X天的日期
      //若输入数据错误,则返回-1,否则为0
      function GregorianCalendar_DecDay(
        //输入、输出参数
        var AYear:integer;var AMonth:integer;var ADay:integer;
        //日期差值
        ADifferent:integer):integer;overload;  //计算某年月日的星座
      function GregorianCalendar_Astrology(
        //输入、输出参数
        AYear:integer;AMonth:integer;ADay:integer;
        //返回值类型:0:数值转换成的字符;1:中文名称;2:英文名称;
        AReturnType:integer;
        //星座返回值
        var AAstrologyString:widestring):integer;implementationconst
      //星座日期表及常量
      //Aries         (March 21     - April 20)       白羊宫(黄道十二宫的第一宫)
      CONST_CONSTELLATE_01_Aries=01;
      //Taurus        (April 21     - May 21)         金牛宫(黄道十二宫的第二宫)
      CONST_CONSTELLATE_02_Taurus=02;
      //Gemini        (May 22       - June 21)        双子宫(黄道十二宫的第三宫)
      CONST_CONSTELLATE_03_Gemini=03;
      //Cancer        (June 22      - July 22)        巨蟹宫(黄道十二宫的第四宫)
      CONST_CONSTELLATE_04_Cancer=04;
      //Leo           (July 23      - August 23)      狮子宫(黄道十二宫的第五宫)
      CONST_CONSTELLATE_05_Leo=05;
      //Virgo         (August 24    - September 23)   处女宫(黄道十二宫的第六宫)
      CONST_CONSTELLATE_06_Virgo=06;
      //Libra         (September 24 - October 23)     天秤宫(黄道十二宫的第七宫)
      CONST_CONSTELLATE_07_Libra=07;
      //Scorpio       (October 24   - November 22)    天蝎宫(黄道十二宫的第八宫)
      CONST_CONSTELLATE_08_Scorpio=08;
      //Sagittarius   (November 23  - December 21)    人马宫(黄道十二宫的第九宫)
      CONST_CONSTELLATE_09_Sagittarius=09;
      //Capricorn     (December 22  - January 20)     摩羯宫(黄道十二宫的第十宫)
      CONST_CONSTELLATE_10_Capricorn=10;
      //Aquarius      (January 21   - February 19)    宝瓶宫(黄道十二宫的第十一宫)
      CONST_CONSTELLATE_11_Aquarius=11;
      //Pisces        (February 20  - March 20)       双鱼宫(黄道十二宫的第十二宫)
      CONST_CONSTELLATE_12_Pisces=12;//检验输入年份是否在计算范围之内(-5000-+5000)
    //True:在范围之内,False:不在范围之内
    function GregorianCalendar_InYearRange(AYear:integer):integer;
    begin
      Result:=-1;
      if (AYear<CONST_GREGORIANCALENDAR_MIN_SOLARYEAR)or
         (AYear>CONST_GREGORIANCALENDAR_MAX_SOLARYEAR) then Exit;
      Result:=0;
    end;//检验某个年份是否为闰年
    //0;是闰年;
    //1:不是闰年;
    //-1:输入年份超出范围
    function GregorianCalendar_IsLeapYear(AYear:integer):integer;
    begin
      Result:=-1;
      //若输入年份范围出错,则返回-1
      if GregorianCalendar_InYearRange(AYear)<>0 then Exit;
      case ((((AYear mod 100)=0)and(((AYear mod 400)=0)))or
            (((AYear mod 400)<>0)and(((AYear mod 4)=0)))) of
        True:   Result:=0;
        False:  Result:=1;
      end;
    end;//计算一年中最大天数
    //-1:输入年份超出范围
    function GregorianCalendar_MAXDayOfYear(AYear:integer):integer;
    begin
      Result:=-1;
      //若输入年份范围出错,则返回-1
      if GregorianCalendar_InYearRange(AYear)<>0 then Exit;
      Result:=365;
      if(GregorianCalendar_IsLeapYear(AYear)=0)then Inc(Result);
    end;//检验月份数值是否在正确范围内
    //True:在范围之内,False:不在范围之内
    function GregorianCalendar_InMonthRange(AMonth:integer):integer;
    begin
      Result:=-1;
      if (AMonth<1)or(AMonth>12)then Exit;
      Result:=0;
    end;//计算某年月日后一月的年月
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_IncMonth(
      var AYear:integer;var AMonth:integer):integer;
    begin
      Result:=-1;
      //若输入年份、月份范围出错,则返回-1
      if (GregorianCalendar_InYearRange(AYear)<>0)or
         (GregorianCalendar_InMonthRange(AMonth)<>0) then Exit;
      if(AMonth=12)then
      begin
        Amonth:=1; Inc(AYear);
      end else Inc(AMonth);
      Result:=0;
    end;//计算某年月日前一月的年月
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_DecMonth(
      var AYear:integer;var AMonth:integer):integer;
    begin
      Result:=-1;
      //若输入年份、月份范围出错,则返回-1
      if (GregorianCalendar_InYearRange(AYear)<>0)or
         (GregorianCalendar_InMonthRange(AMonth)<>0) then Exit;
      if(AMonth=1)then
      begin
        Amonth:=12; Dec(AYear);
      end else Dec(AMonth);
      Result:=0;
    end;//计算某年份某月的最大天数
    //-1:输入数据超出范围
    //其它值:为该月份天数
    function GregorianCalendar_MaxDayOfMonth(
      AYear:integer;AMonth:integer):integer;
    const
      //公历的十二个月的天数
      ARR_SolarDayOfMonth:array[1..12] of Byte=(31,28,31,30,31,30,31,31,30,31,30,31);
    begin
      Result:=-1;
      //若输入年份、月份范围出错,则返回-1
      if (GregorianCalendar_InYearRange(AYear)<>0)or
         (GregorianCalendar_InMonthRange(AMonth)<>0) then Exit;
      //若为闰二月,则为29天,否则根据表中取值
      if ((GregorianCalendar_IsLeapYear(AYear)=0)and(AMonth=2)) then
        Result:=29 else Result:=ARR_SolarDayOfMonth[AMonth];
    end;//计算某年、某月、某日是否在范围之内
    //0:表示正确
    //-1:输入数据超出范围
    function GregorianCalendar_InDayRange(
      AYear:integer;AMonth:integer;ADay:integer):integer;
    var
      MyInt:integer;
    begin
      Result:=-1;
      if (ADay<1) then Exit;
      //若输入数据错误,则退出
      MyInt:=GregorianCalendar_MaxDayOfMonth(AYear,AMonth);
      if (MyInt=-1)or(ADay>MyInt) then Exit;
      Result:=0;
    end;//计算某年、某月、某日与2001/1/1相差的天数
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_DayDifferenceTo20000101(
      //输入参数
      AYear:integer;AMonth:integer;ADay:integer;
      //返回天数的差值
      var ADifferent:integer):integer;
    var
      i:integer;
    begin
      Result:=-1;
      //若输入数据错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)=-1)then Exit;  //设定初始化差值并开始计算
      ADifferent:=0;
      //先计算当前年份的1月1日与2000年1月1日相差天数
      if AYear>2000 then for i:=2000 to AYear-1 do
      begin
        Inc(ADifferent,365);
        //若为闰年则多加一天
        if GregorianCalendar_IsLeapYear(i)=0 then Inc(ADifferent);
      end;
      if AYear<2000 then for i:=AYear to 1999 do
      begin
        Dec(ADifferent,365);
        //若为闰年则多减一天
        if GregorianCalendar_IsLeapYear(i)=0 then Dec(ADifferent);
      end;
      //计算到当前月份1号相差天数
      if AMonth>1 then for i:=1 to AMonth-1 do
      begin
        Inc(ADifferent,GregorianCalendar_MaxDayOfMonth(AYear,i));
      end;
      //计算到当前日子相差天数
      if ADay>1 then Inc(ADifferent,(ADay-1));  //返回值为正确
      Result:=0;
    end;//计算某年、某月、某日为星期几
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_WeekDay(
      //输入参数
      AYear:integer;AMonth:integer;ADay:integer;
      //返回星期几(0:星期天,1-6)
      var AWeekDay:integer):integer;
    var
      MyDifferent:integer;
    begin
      Result:=-1;
      //若输入数据错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0)then Exit;
      if (GregorianCalendar_DayDifferenceTo20000101(
        AYear,AMonth,ADay,MyDifferent)<>0)then Exit;
      //计算星期几
      AWeekDay:=(((MyDifferent+6) mod 7)+7) mod 7;
      //返回值为正确
      Result:=0;
    end;//计算某年月日S(Start)与某年月日E(End)相差的天数
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_DayDifference(
      //输入参数
      AYearS:integer;AMonthS:integer;ADayS:integer;
      //输入参数
      AYearE:integer;AMonthE:integer;ADayE:integer;
      //返回天数的差值
      var ADifferent:integer):integer;
    var
      MyDifferentS,MyDifferentE:integer;
    begin
      Result:=-1;
      //若输入数据错误,则退出
      if(GregorianCalendar_InDayRange(AYearS,AMonthS,ADayS)<>0)or
        (GregorianCalendar_InDayRange(AYearE,AMonthE,ADayE)<>0) then Exit;
      if (GregorianCalendar_DayDifferenceTo20000101(
            AYearS,AMonthS,ADayS,MyDifferentS)<>0)or
         (GregorianCalendar_DayDifferenceTo20000101(
            AYearE,AMonthE,ADayE,MyDifferentE)<>0) then Exit;
      //计算星期几
      ADifferent:=MyDifferentE-MyDifferentS;
      //返回值为正确
      Result:=0;
    end;//计算某年月日后一天的日期
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_IncDay(
      //输入、输出参数
      var AYear:integer;var AMonth:integer;var ADay:integer
      ):integer;overload;
    begin
      Result:=-1;
      //若输入日期错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0) then Exit;
      //若天数到月底
      if(Aday=GregorianCalendar_MaxDayOfMonth(AYear,AMonth))then
      begin
        GregorianCalendar_IncMonth(AYear,AMonth);
        Aday:=1;
      end else Inc(ADay);
      Result:=0;
    end;//计算某年月日前一天的日期
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_DecDay(
      //输入、输出参数
      var AYear:integer;var AMonth:integer;var ADay:integer
      ):integer;overload;
    begin
      Result:=-1;
      //若输入日期错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0) then Exit;
      //若天数到月底
      if(Aday=1)then
      begin
        GregorianCalendar_DecMonth(AYear,AMonth);
        Aday:=GregorianCalendar_MaxDayOfMonth(AYear,AMonth);
      end else Dec(ADay);
      Result:=0;
    end;//计算某年月日后X天的日期
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_IncDay(
      //输入、输出参数
      var AYear:integer;var AMonth:integer;var ADay:integer;
      //日期差值
      ADifferent:integer):integer;
    var
      i:integer;
    begin
      Result:=-1;
      //若增加值为0以下则退出
      if ADifferent<1 then Exit;
      //若输入日期错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0) then Exit;
      //计算日期
      for i:=1 to ADifferent do
      if GregorianCalendar_IncDay(AYear,AMonth,ADay)<>0 then Exit;
      //若输入日期错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0) then Exit;
      Result:=0;
    end;//计算某年月日前X天的日期
    //若输入数据错误,则返回-1,否则为0
    function GregorianCalendar_DecDay(
      //输入、输出参数
      var AYear:integer;var AMonth:integer;var ADay:integer;
      //日期差值
      ADifferent:integer):integer;
    var
      i:integer;
    begin
      Result:=-1;
      //若增加值为0以下则退出
      if ADifferent<1 then Exit;
      //若输入日期错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0) then Exit;
      //计算日期
      for i:=1 to ADifferent do
      if GregorianCalendar_DecDay(AYear,AMonth,ADay)<>0 then Exit;
      //若输入日期错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0) then Exit;
      Result:=0;
    end;//用于计算是否当前日期大于、等于给定开始日期
    function GregorianCalendar_Astrology_GetNumber_CanStepOver(
      AYearS:integer;AMonthS:integer;ADayS:integer;
      AYearE:integer;AMonthE:integer;ADayE:integer):boolean;
    var
      MyDifferent:integer;
    begin
      Result:=False;
      if GregorianCalendar_DayDifference(
        AYearS,AMonthS,ADayS,AYearE,AMonthE,ADayE,MyDifferent)<>0 then Exit;
      if MyDifferent<1 then Exit;
      Result:=not Result;
    end;//计算星座的数值
    //错误返回-1
    function GregorianCalendar_Astrology_GetNumber(
      AYear:integer;AMonth:integer;ADay:integer):integer;
    begin
      //Capricorn     (December 22  - January 20)     摩羯宫(黄道十二宫的第十宫)
      Result:=CONST_CONSTELLATE_10_Capricorn;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,1,20,AYear,AMonth,ADay) then Exit;
      //Aquarius      (January 21   - February 19)    宝瓶宫(黄道十二宫的第十一宫)
      Result:=CONST_CONSTELLATE_11_Aquarius;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,2,19,AYear,AMonth,ADay) then Exit;
      //Pisces        (February 20  - March 20)       双鱼宫(黄道十二宫的第十二宫)
      Result:=CONST_CONSTELLATE_12_Pisces;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,3,20,AYear,AMonth,ADay) then Exit;
      //Aries         (March 21     - April 20)       白羊宫(黄道十二宫的第一宫)
      Result:=CONST_CONSTELLATE_01_Aries;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,4,20,AYear,AMonth,ADay) then Exit;
      //Taurus        (April 21     - May 21)         金牛宫(黄道十二宫的第二宫)
      Result:=CONST_CONSTELLATE_02_Taurus;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,5,21,AYear,AMonth,ADay) then Exit;
      //Gemini        (May 22       - June 21)        双子宫(黄道十二宫的第三宫)
      Result:=CONST_CONSTELLATE_03_Gemini;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,6,21,AYear,AMonth,ADay) then Exit;
      //Cancer        (June 22      - July 22)        巨蟹宫(黄道十二宫的第四宫)
      Result:=CONST_CONSTELLATE_04_Cancer;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,7,22,AYear,AMonth,ADay) then Exit;
      //Leo           (July 23      - August 23)      狮子宫(黄道十二宫的第五宫)
      Result:=CONST_CONSTELLATE_05_Leo;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,8,23,AYear,AMonth,ADay) then Exit;
      //Virgo         (August 24    - September 23)   处女宫(黄道十二宫的第六宫)
      Result:=CONST_CONSTELLATE_06_Virgo;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,9,23,AYear,AMonth,ADay) then Exit;
      //Libra         (September 24 - October 23)     天秤宫(黄道十二宫的第七宫)
      Result:=CONST_CONSTELLATE_07_Libra;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,10,23,AYear,AMonth,ADay) then Exit;
      //Scorpio       (October 24   - November 22)    天蝎宫(黄道十二宫的第八宫)
      Result:=CONST_CONSTELLATE_08_Scorpio;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,11,22,AYear,AMonth,ADay) then Exit;
      //Sagittarius   (November 23  - December 21)    人马宫(黄道十二宫的第九宫)
      Result:=CONST_CONSTELLATE_09_Sagittarius;
      if not GregorianCalendar_Astrology_GetNumber_CanStepOver(
        AYear,12,21,AYear,AMonth,ADay) then Exit;
      //Capricorn     (December 22  - January 20)     摩羯宫(黄道十二宫的第十宫)
      Result:=CONST_CONSTELLATE_10_Capricorn;
    end;//计算某年月日的星座
    function GregorianCalendar_Astrology(
      //输入、输出参数
      AYear:integer;AMonth:integer;ADay:integer;
      //返回值类型:0:数值转换成的字符;1:中文名称;2:英文名称;
      AReturnType:integer;
      //星座返回值
      var AAstrologyString:widestring):integer;
    const
      CONSTARRAY_ASTROLOGYNAME_CHINESE:array[1..12]of widestring
        =('白羊','金牛','双子','巨蟹','狮子','处女',
          '天秤','天蝎','人马','摩羯','宝瓶','双鱼');
      CONSTARRAY_ASTROLOGYNAME_ENGLISH:array[1..12]of widestring
        =('Aries','Taurus','Gemini','Cancer','Leo','Virgo',
          'Libra','Scorpio','Sagittarius','Capricorn','Aquarius','Pisces');
    var
      MyAstrologyNumber:integer;
    begin
      Result:=-1;
      //若输入日期错误,则退出
      if(GregorianCalendar_InDayRange(AYear,AMonth,ADay)<>0) then Exit;
      //计算星座数值
      MyAstrologyNumber:=GregorianCalendar_Astrology_GetNumber(AYear,AMonth,ADay);
      //返回名称
      case AReturnType of
        //数字
        0: AAstrologyString:=IntToStr(MyAstrologyNumber);
        //中文
        1: AAstrologyString:=CONSTARRAY_ASTROLOGYNAME_CHINESE[MyAstrologyNumber];
        //英文
        2: AAstrologyString:=CONSTARRAY_ASTROLOGYNAME_ENGLISH[MyAstrologyNumber];
        else Exit;
      end;
      Result:=0;
    end;end.
      

  2.   

    //------------------------------------------------------------------------------
    //
    //单元内容:提供常用的农历中有关太阳历的转换函数
    //
    //------------------------------------------------------------------------------
    //
    //程序设计:Enlightenment
    //版本代号:1.00.00
    //内部版本:1.00.00
    //联系方式:[email protected] or
    //          [email protected]
    //
    //共享原则:您可以在自己的程序中使用这些代码而无须另行通知作者,
    //          但如果您需要修改代码,请您将修改后的代码发送一份给作者。
    //注意事项:您不可以将该程序的代码直接用于商用目的或类似行为(如收费刊登等),
    //          如果,确实需要商用转帖,请知会作者。
    //
    //          谢谢合作!
    //------------------------------------------------------------------------------unit Unit_ChineseSolarCalendarFunction;interface  //检验输入年份是否在计算范围之内(1901-2050)
      //0:在范围之内,-1:不在范围之内
      function ChineseCalendar_Solar_InYearRange(AYear:integer):integer;  //输入节气的ID,返回节气名称
      function ChineseCalendar_Solar_GetTermName(
        //年份和指定节气的ID(0-23),春分为0,大寒为23
        AYear:integer;ATermID:integer;var ATermName:widestring):integer;  //读取指定年份的指定节气的日期
      //输入节气的ID,返回月份和日期
      function ChineseCalendar_Solar_GetTermDate(
        //年份和指定节气的ID(0-23),春分为0,大寒为23
        AYear:integer;ATermID:integer;
        var AMonth:integer;var ADay:integer):integer;
    implementationuses
      Unit_ChineseCalendarConstant;const
      //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      //每年的二十四节气对应的阳历日期几乎固定,平均分布于十二个月中
      //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      CHINESECALENDAR_LUNARTERMNAME:array[0..23]of string[4]=(
        '立春','雨水','惊蛰','春分','清明','谷雨',
        '立夏','小满','芒种','夏至','小暑','大暑',
        '立秋','处暑','白露','秋分','寒露','霜降',
        '立冬','小雪','大雪','冬至','小寒','大寒');
      //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      //数组CHINESECALENDAR_LUNARTERMDATA存放每年的二十四节气对应的阳历日期
      //注意:1月对应的节气是'小寒','大寒',不是'立春','雨水'
      //数据格式说明>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      //如1901年的节气为
      //  1月    2月    3月  4月    5月  6月  7月    8月  9月    10月  11月    12月
      // 6, 21, 4, 19,  6, 21, 5, 21, 6,22, 6,22, 8, 23, 8, 24, 8, 24, 8, 24, 8, 23, 8, 22
      // 9, 6,  11,4,  9, 6,  10,6,  9,7,  9,7,  7, 8,  7, 9,  7,  9, 7,  9, 7,  8, 7, 15
      //上面第一行数据为每月节气对应日期,15减去每月第一个节气,每月第二个节气减去15得第二行
      //这样每月两个节气对应数据都小于16,每月用一个字节存放,
      //高位存放第一个节气数据,低位存放第二个节气的数据
      //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      CHINESECALENDAR_LUNARTERMDATA:array[
        CONST_CHINESECALENDAR_MIN_SOLARYEAR..
        CONST_CHINESECALENDAR_MAX_SOLARYEAR,0..11] of Byte=(
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1901
        ($96, $A4, $96, $96, $97, $87, $79, $79, $79, $69, $78, $78),  //1902
        ($96, $A5, $87, $96, $87, $87, $79, $69, $69, $69, $78, $78),  //1903
        ($86, $A5, $96, $A5, $96, $97, $88, $78, $78, $79, $78, $87),  //1904
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1905
        ($96, $A4, $96, $96, $97, $97, $79, $79, $79, $69, $78, $78),  //1906
        ($96, $A5, $87, $96, $87, $87, $79, $69, $69, $69, $78, $78),  //1907
        ($86, $A5, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1908
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1909
        ($96, $A4, $96, $96, $97, $97, $79, $79, $79, $69, $78, $78),  //1910
        ($96, $A5, $87, $96, $87, $87, $79, $69, $69, $69, $78, $78),  //1911
        ($86, $A5, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1912
        ($95, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1913
        ($96, $B4, $96, $A6, $97, $97, $79, $79, $79, $69, $78, $78),  //1914
        ($96, $A5, $97, $96, $97, $87, $79, $79, $69, $69, $78, $78),  //1915
        ($96, $A5, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1916
        ($95, $B4, $96, $A6, $96, $97, $78, $79, $78, $69, $78, $87),  //1917
        ($96, $B4, $96, $A6, $97, $97, $79, $79, $79, $69, $78, $77),  //1918
        ($96, $A5, $97, $96, $97, $87, $79, $79, $69, $69, $78, $78),  //1919
        ($96, $A5, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1920
        ($95, $B4, $96, $A5, $96, $97, $78, $79, $78, $69, $78, $87),  //1921
        ($96, $B4, $96, $A6, $97, $97, $79, $79, $79, $69, $78, $77),  //1922
        ($96, $A4, $96, $96, $97, $87, $79, $79, $69, $69, $78, $78),  //1923
        ($96, $A5, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1924
        ($95, $B4, $96, $A5, $96, $97, $78, $79, $78, $69, $78, $87),  //1925
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1926
        ($96, $A4, $96, $96, $97, $87, $79, $79, $79, $69, $78, $78),  //1927
        ($96, $A5, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1928
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1929
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1930
        ($96, $A4, $96, $96, $97, $87, $79, $79, $79, $69, $78, $78),  //1931
        ($96, $A5, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1932
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1933
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1934
        ($96, $A4, $96, $96, $97, $97, $79, $79, $79, $69, $78, $78),  //1935
        ($96, $A5, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1936
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1937
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1938
        ($96, $A4, $96, $96, $97, $97, $79, $79, $79, $69, $78, $78),  //1939
        ($96, $A5, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1940
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1941
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1942
        ($96, $A4, $96, $96, $97, $97, $79, $79, $79, $69, $78, $78),  //1943
        ($96, $A5, $96, $A5, $A6, $96, $88, $78, $78, $78, $87, $87),  //1944
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1945
        ($95, $B4, $96, $A6, $97, $97, $78, $79, $78, $69, $78, $77),  //1946
        ($96, $B4, $96, $A6, $97, $97, $79, $79, $79, $69, $78, $78),  //1947
        ($96, $A5, $A6, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //1948
        ($A5, $B4, $96, $A5, $96, $97, $88, $79, $78, $79, $77, $87),  //1949
        ($95, $B4, $96, $A5, $96, $97, $78, $79, $78, $69, $78, $77),  //1950
        ($96, $B4, $96, $A6, $97, $97, $79, $79, $79, $69, $78, $78),  //1951
        ($96, $A5, $A6, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //1952
        ($A5, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1953
        ($95, $B4, $96, $A5, $96, $97, $78, $79, $78, $68, $78, $87),  //1954
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1955
        ($96, $A5, $A5, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //1956
        ($A5, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1957
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1958
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1959
        ($96, $A4, $A5, $A5, $A6, $96, $88, $88, $88, $78, $87, $87),  //1960
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1961
        ($96, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1962
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1963
        ($96, $A4, $A5, $A5, $A6, $96, $88, $88, $88, $78, $87, $87),  //1964
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1965
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1966
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1967
        ($96, $A4, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //1968
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1969
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1970
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77),  //1971
        ($96, $A4, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //1972
        ($A5, $B5, $96, $A5, $A6, $96, $88, $78, $78, $78, $87, $87),  //1973
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1974
        ($96, $B4, $96, $A6, $97, $97, $78, $79, $78, $69, $78, $77),  //1975
        ($96, $A4, $A5, $B5, $A6, $A6, $88, $89, $88, $78, $87, $87),  //1976
        ($A5, $B4, $96, $A5, $96, $96, $88, $88, $78, $78, $87, $87),  //1977
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $78, $87),  //1978
        ($96, $B4, $96, $A6, $96, $97, $78, $79, $78, $69, $78, $77),  //1979
        ($96, $A4, $A5, $B5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //1980
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $77, $87),  //1981
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1982
        ($95, $B4, $96, $A5, $96, $97, $78, $79, $78, $69, $78, $77),  //1983
        ($96, $B4, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $87),  //1984
        ($A5, $B4, $A6, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //1985
        ($A5, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //1986
        ($95, $B4, $96, $A5, $96, $97, $88, $79, $78, $69, $78, $87),  //1987
        ($96, $B4, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //1988
        ($A5, $B4, $A5, $A5, $A6, $96, $88, $88, $88, $78, $87, $87),  //1989
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $79, $77, $87),  //1990
        ($95, $B4, $96, $A5, $86, $97, $88, $78, $78, $69, $78, $87),  //1991
        ($96, $B4, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //1992
        ($A5, $B3, $A5, $A5, $A6, $96, $88, $88, $88, $78, $87, $87),  //1993
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1994
        ($95, $B4, $96, $A5, $96, $97, $88, $76, $78, $69, $78, $87),  //1995
        ($96, $B4, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //1996
        ($A5, $B3, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //1997
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //1998
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //1999
        ($96, $B4, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //2000
        ($A5, $B3, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //2001
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //2002
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //2003
        ($96, $B4, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //2004
        ($A5, $B3, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //2005
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2006
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $69, $78, $87),  //2007
        ($96, $B4, $A5, $B5, $A6, $A6, $87, $88, $87, $78, $87, $86),  //2008
        ($A5, $B3, $A5, $B5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //2009
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2010
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $78, $87),  //2011
        ($96, $B4, $A5, $B5, $A5, $A6, $87, $88, $87, $78, $87, $86),  //2012
        ($A5, $B3, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $87),  //2013
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2014
        ($95, $B4, $96, $A5, $96, $97, $88, $78, $78, $79, $77, $87),  //2015
        ($95, $B4, $A5, $B4, $A5, $A6, $87, $88, $87, $78, $87, $86),  //2016
        ($A5, $C3, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $87),  //2017
        ($A5, $B4, $A6, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2018
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $79, $77, $87),  //2019
        ($95, $B4, $A5, $B4, $A5, $A6, $97, $87, $87, $78, $87, $86),  //2020
        ($A5, $C3, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //2021
        ($A5, $B4, $A5, $A5, $A6, $96, $88, $88, $88, $78, $87, $87),  //2022
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $79, $77, $87),  //2023
        ($95, $B4, $A5, $B4, $A5, $A6, $97, $87, $87, $78, $87, $96),  //2024
        ($A5, $C3, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //2025
        ($A5, $B3, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //2026
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //2027
        ($95, $B4, $A5, $B4, $A5, $A6, $97, $87, $87, $78, $87, $96),  //2028
        ($A5, $C3, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //2029
        ($A5, $B3, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //2030
        ($A5, $B4, $96, $A5, $96, $96, $88, $78, $78, $78, $87, $87),  //2031
        ($95, $B4, $A5, $B4, $A5, $A6, $97, $87, $87, $78, $87, $96),  //2032
        ($A5, $C3, $A5, $B5, $A6, $A6, $88, $88, $88, $78, $87, $86),  //2033
        ($A5, $B3, $A5, $A5, $A6, $A6, $88, $78, $88, $78, $87, $87),  //2034
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2035
        ($95, $B4, $A5, $B4, $A5, $A6, $97, $87, $87, $78, $87, $96),  //2036
        ($A5, $C3, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $86),  //2037
        ($A5, $B3, $A5, $A5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //2038
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2039
        ($95, $B4, $A5, $B4, $A5, $A6, $97, $87, $87, $78, $87, $96),  //2040
        ($A5, $C3, $A5, $B5, $A5, $A6, $87, $88, $87, $78, $87, $86),  //2041
        ($A5, $B3, $A5, $B5, $A6, $A6, $88, $88, $88, $78, $87, $87),  //2042
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2043
        ($95, $B4, $A5, $B4, $A5, $A6, $97, $87, $87, $88, $87, $96),  //2044
        ($A5, $C3, $A5, $B4, $A5, $A6, $87, $88, $87, $78, $87, $86),  //2045
        ($A5, $B3, $A5, $B5, $A6, $A6, $87, $88, $88, $78, $87, $87),  //2046
        ($A5, $B4, $96, $A5, $A6, $96, $88, $88, $78, $78, $87, $87),  //2047
        ($95, $B4, $A5, $B4, $A5, $A5, $97, $87, $87, $88, $86, $96),  //2048
        ($A4, $C3, $A5, $A5, $A5, $A6, $97, $87, $87, $78, $87, $86),  //2049
        ($A5, $C3, $A5, $B5, $A6, $A6, $87, $88, $78, $78, $87, $87));  //2050
    //输入节气的ID,返回节气名称
    function ChineseCalendar_Solar_GetTermName(
      //年份和指定节气的ID(0-23),春分为0,大寒为23
      AYear:integer;ATermID:integer;var ATermName:widestring):integer;
    begin
      Result:=-1;
      //检查年份的范围
      if ChineseCalendar_Solar_InYearRange(AYear)=-1 then Exit;
      //检查节气序号范围
      if(ATermID<0)or(ATermID>23) then Exit;
      //取节气名称
      ATermName:=CHINESECALENDAR_LUNARTERMNAME[ATermID];
      Result:=0;
    end;//读取指定年份的指定节气的日期
    //输入节气的ID,返回月份和日期
    function ChineseCalendar_Solar_GetTermDate(
      //年份和指定节气的ID(0-23),春分为0,大寒为23
      AYear:integer;ATermID:integer;
      var AMonth:integer;var ADay:integer):integer;
    begin
      Result:=-1;
      //检查年份的范围
      if ChineseCalendar_Solar_InYearRange(AYear)=-1 then Exit;
      //检查节气序号范围
      if(ATermID<0)or(ATermID>23) then Exit;
      //获得月份
      AMonth:=((ATermID+2)mod 24 div 2)+1;
      case (ATermID mod 2) of
        0:  ADay:=15-CHINESECALENDAR_LUNARTERMDATA[AYear][AMonth]div$10;
        1:  ADay:=15+CHINESECALENDAR_LUNARTERMDATA[AYear][AMonth]mod$10;
      end;
      Result:=0;
    end;  
    //检验输入年份是否在计算范围之内(1901-2050)
    //0:在范围之内,-1:不在范围之内
    function ChineseCalendar_Solar_InYearRange(AYear:integer):integer;
    begin
      Result:=-1;
      if(AYear<CONST_CHINESECALENDAR_MIN_SOLARYEAR) or
        (AYear>CONST_CHINESECALENDAR_MAX_SOLARYEAR) then Exit;
      Result:=0;
    end;end.
    //------------------------------------------------------------------------------
    //
    //单元内容:农历中太阴历部分的常用函数
    //
    //------------------------------------------------------------------------------
    //
    //程序设计:Enlightenment
    //版本代号:1.00.00
    //内部版本:1.00.00
    //联系方式:[email protected] or
    //          [email protected]
    //
    //共享原则:您可以在自己的程序中使用这些代码而无须另行通知作者,
    //          但如果您需要修改代码,请您将修改后的代码发送一份给作者。
    //注意事项:您不可以将该程序的代码直接用于商用目的或类似行为(如收费刊登等),
    //          如果,确实需要商用转帖,请知会作者。
    //
    //          谢谢合作!
    //------------------------------------------------------------------------------unit Unit_ChineseLunarCalendarFunction;interface  //检验输入年份是否在计算范围之内(-5000-5000)
      //0:在范围之内,-1:不在范围之内
      function ChineseCalendar_Lunar_InYearRange(AYear:integer):integer;  //计算某年份的天干地支值(0表甲子,59表辛亥)
      //输入的年份应当是农历的年份
      //错误返回-1
      function ChineseCalendar_Lunar_YearEraValue(AYear:integer):integer;  //计算某年份的属相
      //输入的年份应当是农历的年份
      //错误返回-1
      function ChineseCalendar_Lunar_YearAnimal(
        AYear:integer;var AAnimalName:widestring):integer;  //计算某年份的干支
      //输入的年份应当是农历的年份
      //错误返回-1
      function ChineseCalendar_Lunar_YearEraName(
        AYear:integer;var AEraName:widestring):integer;  //返回某年的闰月的月份
      //输入的年份应当是农历的年份
      //错误返回-1,没有闰月返回0
      function ChineseCalendar_Lunar_LeapMonth(AYear:integer):integer;
    implementationuses
      Unit_ChineseCalendarConstant;
    //检验输入年份是否在计算范围之内(-5000-5000)
    //0:在范围之内,-1:不在范围之内
    function ChineseCalendar_Lunar_InYearRange(AYear:integer):integer;
    begin
      Result:=-1;
      if(AYear<CONST_CHINESECALENDAR_MIN_LUNARYEAR) or
        (AYear>CONST_CHINESECALENDAR_MAX_LUNARYEAR) then Exit;
      Result:=0;
    end;//计算某年份的天干地支值(0表甲子,59表辛亥)
    //输入的年份应当是农历的年份
    //错误返回-1
    function ChineseCalendar_Lunar_YearEraValue(AYear:integer):integer;
    begin
      Result:=-1;
      if ChineseCalendar_Lunar_InYearRange(AYear)<>0 then Exit;
      Result:=((AYear-4)mod 60+60)mod 60;
    end;//计算某年份的属相
    //输入的年份应当是农历的年份
    //错误返回-1
    function ChineseCalendar_Lunar_YearAnimal(
      AYear:integer;var AAnimalName:widestring):integer;
    var
      MyEraValue:integer;
    begin
      Result:=-1;
      MyEraValue:=ChineseCalendar_Lunar_YearEraValue(AYear);
      if MyEraValue=-1 then Exit;
      AAnimalName:=CHINESECALENDAR_LUNAR_ERAANIMAL[MyEraValue mod 12];
      Result:=0;
    end;//计算某年份的干支
    //输入的年份应当是农历的年份
    //错误返回-1
    function ChineseCalendar_Lunar_YearEraName(
      AYear:integer;var AEraName:widestring):integer;
    var
      MyEraValue:integer;
    begin
      Result:=-1;
      //获取天干地支的序数(0表甲子,59表辛亥)
      MyEraValue:=ChineseCalendar_Lunar_YearEraValue(AYear);
      if MyEraValue=-1 then Exit;
      AEraName:=CHINESECALENDAR_LUNAR_ERASKY[MyEraValue mod 10]+
                CHINESECALENDAR_LUNAR_ERAEARTH[MyEraValue mod 12];
      Result:=0;
    end;//返回某年的闰月的月份
    //输入的年份应当是农历的年份
    //错误返回-1,没有闰月返回0
    function ChineseCalendar_Lunar_LeapMonth(AYear:integer):integer;
    begin
      //获取该年月份列表和闰月的月份
      //获取(该年公历对应的农历的顺序中)月份中的闰月的月份
      if ChineseCalendar_DataConvert_GetBasicLunarData(
        AYear,3,Result)=-1 then Result:=-1;
      if Result=0 then Result:=-1;
    end;end.
      

  3.   

    //------------------------------------------------------------------------------
    //
    //单元内容:农历中阳历与阴历的转换函数
    //
    //------------------------------------------------------------------------------
    //
    //程序设计:Enlightenment
    //版本代号:1.00.00
    //内部版本:1.00.00
    //联系方式:[email protected] or
    //          [email protected]
    //
    //共享原则:您可以在自己的程序中使用这些代码而无须另行通知作者,
    //          但如果您需要修改代码,请您将修改后的代码发送一份给作者。
    //注意事项:您不可以将该程序的代码直接用于商用目的或类似行为(如收费刊登等),
    //          如果,确实需要商用转帖,请知会作者。
    //
    //          谢谢合作!
    //------------------------------------------------------------------------------unit Unit_ChineseCalendarConvertFunction;interfaceuses
      Dialogs,SysUtils;
      
      //农历中阳历转换到阴历
      //成功转换返回为0,输入数据超出范围返回-1
      function ChineseCalendar_SolarToLunar(
      //输入和输出参数
      var AYear:integer;var AMonth:integer;var ADay:integer;
        //结果是否为闰月
        var ALeapMonth:integer):integer;  //农历中阴历转换到阳历
      //成功转换返回为0,输入数据超出范围返回-1,闰月标记错误返回-2
      function ChineseCalendar_LunarToSolar(
        //输入和输出参数
        var AYear:integer;var AMonth:integer;var ADay:integer;
        //是否为闰月
        ALeapMonth:integer):integer;implementationuses
      Unit_ChineseCalendarConstant,
      Unit_ChineseSolarCalendarFunction,
      Unit_GregorianCalendarFunction;//公历转换到农历
    function ChineseCalendar_SolarToLunarEx(
      //输入和输出参数
      AYear:integer;AMonth:integer;ADay:integer;
      //输入和输出参数
      var OYear:integer;var OMonth:integer;var ODay:integer;
      //结果是否为闰月
      var ALeapMonth:integer):integer;
    var
      i,MyLeapMonthNumber:integer;
      FirstDayNumber,DaysDistance,TempDaysCount:Integer;
      MonthNumberList:array[0..15]of integer;
    begin
      Result:=-1;
      //获取该年的1月1号对应的农历的某月的天数的号数
      if ChineseCalendar_DataConvert_GetTheFirstLunarDay(AYear,FirstDayNumber)=-1 then Exit;
      //获取公历月份转换成农历的列表(其中i在此处仅为填补参数,无其它用意)
      if ChineseCalendar_DataConvert_GetMonthList(AYear,MyLeapMonthNumber,MonthNumberList)=-1 then Exit;
      //计算公历日期是该年的第多少天
      if GregorianCalendar_DayDifference(AYear,1,1,AYear,AMonth,ADay,DaysDistance)=-1 then Exit;
      //若间隔日期小于本月剩余,则需要求本月是否为闰月
      if DaysDistance<=(ChineseCalendar_DataConvert_GetMonthSize(AYear,0)-FirstDayNumber) then
      begin
        //若计算年份将推算至1901年以下,则退出
        //该年需要计算上一年最后一个月是否为闰月
        if(AYear<(CONST_CHINESECALENDAR_MIN_SOLARYEAR+1))then Exit;
        //计算上一年最后一个月是否为闰月
        if ChineseCalendar_SolarToLunarEx(AYear-1,12,31,OYear,OMonth,ODay,ALeapMonth)=-1 then Exit;
        Inc(ODay,DaysDistance+1);
      end
      else
      begin
        OYear:=AYear; i:=1;
        //计算第一个月(农历)剩余天数
        TempDaysCount:=ChineseCalendar_DataConvert_GetMonthSize(AYear,0)-FirstDayNumber;
        //若剩余天数加上下月小于距离天数
        while((TempDaysCount+ChineseCalendar_DataConvert_GetMonthSize(AYear,i))<DaysDistance) do
        begin
          //用于比较的天数增加,月份增加
          Inc(TempDaysCount,ChineseCalendar_DataConvert_GetMonthSize(AYear,i)); Inc(i);
        end;
        OMonth:=MonthNumberList[i]; ODay:=DaysDistance-TempDaysCount;
        //归整数据
        if I=(MyLeapMonthNumber+1)then ALeapMonth:=0 else ALeapMonth:=-1;
      end;
      Result:=0;
    end;//公历转换到农历
    function ChineseCalendar_SolarToLunar(
      //输入和输出参数
      var AYear:integer;var AMonth:integer;var ADay:integer;
      //结果是否为闰月
      var ALeapMonth:integer):integer;
    begin
      Result:=ChineseCalendar_SolarToLunarEx(
        AYear,AMonth,ADay,AYear,AMonth,ADay,ALeapMonth);
    end;//农历转换到公历
    //成功转换返回为0,输入数据超出范围返回-1,闰月标记错误返回-2
    function ChineseCalendar_LunarToSolar(
      //输入和输出参数
      var AYear:integer;var AMonth:integer;var ADay:integer;
      //是否为闰月,0为闰月
      ALeapMonth:integer):integer;
    var
      MonthNumberList:array[0..15]of integer;
      i,TempInt,MyLeapMonthNumber,MyFirstMonthNumber:integer;
      FirstDayNumber,TempDaysCount:Integer;
    begin
      Result:=-1;
      //获取公历月份转换成农历的列表(其中i在此处仅为填补参数,无其它用意)
      if ChineseCalendar_DataConvert_GetMonthList(AYear,MyLeapMonthNumber,MonthNumberList)=-1 then Exit;
      //检验该D年的闰月是否正确,若所求月为闰月则检测是否正确
      if ALeapMonth=0 then if AMonth<>MyLeapMonthNumber then Exit;
      //获取该年的1月1号对应的农历的某月的天数的号数
      if ChineseCalendar_DataConvert_GetTheFirstLunarDay(AYear,FirstDayNumber)=-1 then Exit;
      //计算第一个月(农历)剩余天数
      TempDaysCount:=ChineseCalendar_DataConvert_GetMonthSize(AYear,0)-FirstDayNumber;
      //获取该年的1月1号对应的农历的月份
      if ChineseCalendar_DataConvert_GetTheFirstLunarMonth(AYear,MyFirstMonthNumber)=-1 then Exit;
      //所求农历月份对应表格中月份的序数
      TempInt:=(12-MyFirstMonthNumber)+AMonth;
      //计算该年农历月份初一与公历日期1月1日相差的天数
      if TempInt>1 then for i:=1 to (TempInt-1) do
        Inc(TempDaysCount,ChineseCalendar_DataConvert_GetMonthSize(AYear,i));
      //若为闰月则加上闰月天数
      if (ALeapMonth=0)or
         ((AMonth>MyLeapMonthNumber)and(MyLeapMonthNumber<>0)) then
      begin
        Inc(TempDaysCount,ChineseCalendar_DataConvert_GetMonthSize(AYear,TempInt));
        Inc(TempInt);
      end;
      //若输入农历的日的值错误则退出
      if (ADay<1)or(ADay>ChineseCalendar_DataConvert_GetMonthSize(AYear,TempInt))then Exit;
      //加上最后月的天数
      Inc(TempDaysCount,ADay);
      //计算对应的公历的日期
      AMonth:=1;ADay:=1;
      if GregorianCalendar_IncDay(AYear,AMonth,ADay,TempDaysCount)=-1 then Exit;
      Result:=0;
    end;end.    最后,说明,由于是初稿,还有很多地方的算法很繁杂(譬如日历差值计算部分),就先贴出了吧!
      

  4.   

    不允许回复为空!!不允许有 gz、up!!!!来点创意吧!!!
      

  5.   

    不允许回复为空!!不允许有 gz、up!!!!来点创意吧!!!