//------------------------------------------------------------------------------
//
//单元内容:农历函数中的全局数据、函数的定义
//
//------------------------------------------------------------------------------
//
//程序设计: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.
//
//单元内容:农历函数中的全局数据、函数的定义
//
//------------------------------------------------------------------------------
//
//程序设计: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.
解决方案 »
- 求助:Delphi7中在DLL里封装UDPServer,不能正确运行?
- 在delphi中怎么用程序给一个image控件付给一张新图片
- 请了解PDF的高手忙我啊!!分要多少给多少
- 一个简单的函数问题————在线等待!!!!!!
- TComboBox的values的使用方法
- 50分在线等待..................
- 关于动态设置StoredProc的StoredProcName的很菜的问题,请教。
- 【急】TAdoQuery控件,sql语句是insert...,其中一个参数是日期类型,如何给这个参数赋空值
- Samplegrabber问题?
- 手机短消息是如何实现的?
- 数据是什么时候真正写进数据库的?
- F1Book控件的问题
//
//单元内容:提供常用的公历的转换函数
//------------------------------------------------------------------------------
//
//程序设计: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.
//
//单元内容:提供常用的农历中有关太阳历的转换函数
//
//------------------------------------------------------------------------------
//
//程序设计: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.
//
//单元内容:农历中阳历与阴历的转换函数
//
//------------------------------------------------------------------------------
//
//程序设计: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. 最后,说明,由于是初稿,还有很多地方的算法很繁杂(譬如日历差值计算部分),就先贴出了吧!