const
START_YEAR=1901;
END_YEAR=2050;
//Gibt die Anzahl der Tage in iMonth Monat von iYear Jahr 1 Jahr Januar---Dezember 65535 zurück
functionMonthDays(iYear,iMonth:Word):Word;
//Gibt die Anzahl der Tage im Mondjahr iLunarYer Jahr und den Mondmonat iLunarMonth zurück. Wenn iLunarMonth ein Schaltmonat ist,
//Das High Word ist die Anzahl der Tage im zweiten iLunarMonth-Monat, andernfalls ist das High Word 01901 Januar---Dezember 2050
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
//Gibt die Gesamtzahl der Tage im Mondkalenderjahr iLunarYear von Januar 1901 bis Dezember 2050 zurück
functionLunarYearDays(iLunarYear:Word):Word;
//Gib den Schaltmonat des Mondkalenderjahres iLunarYear zurück, wenn nicht, gib Januar 01901---Dezember 2050 zurück
functionGetLeapMonth(iLunarYear:Word):Word;
// iYear in einen String formatieren, der durch die Tianqian-Notationsmethode dargestellt wird
PROcedureFormatLunarYear(iYear:Word;varpBuffer:string);overload;
functionFormatLunarYear(iYear:Word):string;overload;
//Formatiere iMonth in einen chinesischen String
procedureFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean=True);overload;
functionFormatMonth(iMonth:Word;bLunar:Boolean=True):string;overload;
// iDay in chinesischen String formatieren
procedureFormatLunarDay(iDay:Word;varpBuffer:string);overload;
functionFormatLunarDay(iDay:Word):string;overload;
//Berechnen Sie die Anzahl der Tage zwischen zwei Daten im Gregorianischen Kalender: 1. Januar, 1 Jahr --- 31. Dezember 65535
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word=START_YEAR;iStartMonth:Word=1;iStartDay:Word=1):Longword;overload;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;overload;
// Berechnen Sie das Monddatum, das dem iMonth-Monat iDay im gregorianischen Kalender iYear entspricht, und geben Sie die entsprechenden Mond-Sonnenbedingungen 0-24 zurück
//1. Januar 1901---31. Dezember 2050
functionGetLunarHolDay(InDate:TDateTime):string;overload;
functionGetLunarHolDay(iYear,iMonth,iDay:Word):string;overload;
//privatefunction-----------------------------------------
//Berechnen Sie das Monddatum nach iSpanDays-Tagen ab dem 1. Januar 1901
procedurel_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
//Berechnen Sie die Sonnenterme 0-24, die iMonth, iDay, iYear im Gregorianischen Kalender entsprechen. 0 bedeutet, dass es sich nicht um einen Sonnenterm handelt
functionl_GetLunarHolDay(iYear,iMonth,iDay:Word):Word;
Durchführung
var
//Das Array gLunarDay speichert die Anzahl der Monate und Tage in jedem Jahr von 1901 bis 2100 im Mondkalender,
//Der Mondkalender kann nur 29 oder 30 Tage in einem Monat haben, und ein Jahr wird durch 12 (oder 13) Binärziffern dargestellt. Die entsprechende Ziffer ist 1, was 30 Tage bedeutet, andernfalls sind es 29 Tage.
gLunarMonthDay:array[0..149]ofWord=(
//Die Testdaten sind nur 1901.1.1--2050.12.31
$4ae0, $a570, $5268, $d260, $d950, $6aa8, $56a0, $9ad0, $4ae8, $4ae0,//1910
$a4d8, $a4d0, $d250, $d548, $b550, $56a0, $96d0, $95b0, $49b8, $49b0,//1920
$a4b0, $b258, $6a50, $6d40, $ada8, $2b60, $9570, $4978, $4970, $64b0,//1930
$d4a0,$ea50,$6d48,$5ad0,$2b60,$9370,$92e0,$c968,$c950,$d4a0,//1940
$da50,$b550,$56a0,$aad8,$25d0,$92d0,$c958,$a950,$b4a8,$6ca0,//1950
$b550,$55a8,$4da0,$a5b0,$52b8,$52b0,$a950,$e950,$6aa0,$ad50,//1960
$ab50,$4b60,$a570,$a570,$5260,$e930,$d950,$5aa8,$56a0,$96d0,//1970
$4ae8,$4ad0,$a4d0,$d268,$d250,$d528,$b540,$b6a0,$96d0,$95b0,//1980
$49b0,$a4b8,$a4b0,$b258,$6a50,$6d40,$ada0,$ab60,$9370,$4978,//1990
$4970,$64b0,$6a50,$ea50,$6b28,$5ac0,$ab60,$9368,$92e0,$c960,//2000
$d4a8, $d4a0, $da50, $5aa8, $56a0, $aad8, $25d0, $92d0, $c958, $a950,//2010
$b4a0,$b550,$b550,$55a8,$4ba0,$a5b0,$52b8,$52b0,$a930,$74a8,//2020
$6aa0,$ad50,$4da8,$4b60,$9570,$a4e0,$d260,$e930,$d530,$5aa0,//2030
$6b50,$96d0,$4ae8,$4ad0,$a4d0,$d258,$d250,$d520,$daa0,$b5a0,//2040
$56d0,$4ad8,$49b0,$a4b8,$a4b0,$aa50,$b528,$6d20,$ada0,$55b0);//2050
//Das Array gLanarMonth speichert den Monat des Schaltmonats von 1901 bis 2050 im Mondkalender. Wenn es keinen Schaltmonat gibt, ist er 0. Jedes Byte wird zwei Jahre lang gespeichert.
gLunarMonth:array[0..74]ofByte=(
00 $, 50 $, 04 $, 00 $, 20 $,//1910
60 $, 05 $, 00 $, 20 $, 70 $,//1920
05 $, 00 $, 40 $, 02 $, 06 $,//1930
00 $, 50 $, 03 $, 07 $, 00 $,//1940
60 $, 04 $, 00 $, 20 $, 70 $,//1950
05 $, 00 $, 30 $, 80 $, 06 $,//1960
00 $, 40 $, 03 $, 07 $, 00 $,//1970
50 $, 04 $, 08 $, 00 $, 60 $,//1980
$04,$0a,$00,$60,$05,//1990
00 $, 30 $, 80 $, 05 $, 00 $,//2000
40 $, 02 $, 07 $, 00 $, 50 $,//2010
04 $, 09 $, 00 $, 60 $, 04 $,//2020
00 $, 20 $, 60 $, 05 $, 00 $,//2030
$30,$b0,$06,$00,$50,//2040
02 $, 07 $, 00 $, 50 $, 03 $);//2050
//Das Array gLanarHoliDay speichert die Sonnenkalenderdaten, die den vierundzwanzig Sonnenperioden jedes Jahres entsprechen.
//Die Sonnenkalenderdaten, die den vierundzwanzig Sonnenperioden eines jeden Jahres entsprechen, sind nahezu festgelegt und gleichmäßig über die zwölf Monate verteilt.
//Januar, Februar, März, April, Mai, Juni
//Kleine Kälte, Große Kälte, Frühlingsanfang, Regen, Frühlings-Tagundnachtgleiche, Qingming, Getreideregen, Sommeranfang, Kleine Mandschurei, Sommersonnenwende
//Juli, August, September, Oktober, November, Dezember
//Leichter Sommer, große Hitze, Herbstanfang, Sommer, weißer Tau, Herbst-Tagundnachtgleiche, kalter Tau, Frost, Winteranfang, leichter Schneefall, starker Schneefall, Wintersonnenwende
{************************************************ * *******************************
Es gibt keine festen Regeln für Solarbegriffe, daher muss ich Tabellen speichern, um Platz zu sparen, also ...
************************************************** * *******************************}
//Beschreibung des Datenformats:
//Zum Beispiel ist der Sonnenbegriff im Jahr 1901
//Januar, Februar, März, April, Mai, Juni, Juli, August, September, Oktober, November, Dezember
//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
//Die erste Datenzeile oben ist das Datum, das der monatlichen Sonnenperiode entspricht, 15 minus der ersten Sonnenperiode jedes Monats und der zweiten Sonnenperiode jedes Monats minus 15, um die zweite Zeile zu erhalten
// Auf diese Weise sind die entsprechenden Daten der beiden Solarterme jeden Monat kleiner als 16 und jeder Monat wird in einem Byte gespeichert. Das High-Bit speichert die Daten des ersten Solarterms und das Low-Bit speichert sie.
//Die Daten des zweiten Sonnenterms können der folgenden Tabelle entnommen werden
gLunarHolDay:array[0..1799]ofByte=(
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
functionMonthDays(iYear,iMonth:Word):Word;
beginnen
caseiMonthof
1,3,5,7,8,10,12:Ergebnis:=31;
4,6,9,11:Ergebnis:=30;
2://Wenn es ein Schaltjahr ist
ifIsLeapYear(iYear)then
Ergebnis:=29
anders
Ergebnis:=28
anders
Ergebnis:=0;
Ende;
Ende;
functionGetLeapMonth(iLunarYear:Word):Word;
var
Flag:Byte;
beginnen
Flag:=gLunarMonth[(iLunarYear-START_YEAR)div2];
if(iLunarYear-START_YEAR)mod2=0then
Ergebnis:=Flagshr4
anders
Ergebnis:=Flagand$0F;
Ende;
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
var
Höhe,Niedrig:Wort;
iBit:Integer;
beginnen
ifiLunarYear<START_YEARdann
beginnen
Ergebnis:=30;
Ausfahrt;
Ende;
Höhe:=0;
Niedrig:=29;
iBit:=16-iLunarMonth;
if(iLunarMonth>GetLeapMonth(iLunarYear))and(GetLeapMonth(iLunarYear)>0)then
Dec(iBit);
if(gLunarMonthDay[iLunarYear-START_YEAR]and(1shliBit))>0then
Inc(Niedrig);
ifiLunarMonth=GetLeapMonth(iLunarYear)then
if(gLunarMonthDay[iLunarYear-START_YEAR]and(1shl(iBit-1)))>0then
Höhe:=30
anders
Höhe:=29;
Ergebnis:=MakeLong(Low,Height);
Ende;
functionLunarYearDays(iLunarYear:Word):Word;
var
Tage,i:Wort;
tmp:Langwort;
beginnen
Tage:=0;
fori:=1to12do
beginnen
tmp:=LunarMonthDays(iLunarYear,i);
Tage:=Tage+HiWord(tmp);
Tage:=Tage+LoWord(tmp);
Ende;
Ergebnis:=Tage;
Ende;
procedureFormatLunarYear(iYear:Word;varpBuffer:string);
var
szText1,szText2,szText3:string;
beginnen
szText1:='A, B, C, D, Wu, Ji, Geng, Xin Rengui';
szText2:='Zichou Yinmaochen Siwu hat sich nicht für Youxuhai beworben';
szText3:='Ratte, Ochse, Tiger, Drache, Schlange, Pferd, Schaf, Affe, Huhn, Hund und Schwein';
pBuffer:=Copy(szText1,((iYear-4)mod10)*2+1,2);
pBuffer:=pBuffer+Copy(szText2,((iYear-4)mod12)*2+1,2);
pBuffer:=pBuffer+'';
pBuffer:=pBuffer+Copy(szText3,((iYear-4)mod12)*2+1,2);
pBuffer:=pBuffer+'year';
Ende;
functionFormatLunarYear(iYear:Word):string;
var
pBuffer: string;
beginnen
FormatLunarYear(iYear,pBuffer);
Ergebnis:=pBuffer;
Ende;
procedureFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean);
var
szText:string;
beginnen
if(notbLunar)and(iMonth=1)then
beginnen
pBuffer:='Januar';
Ausfahrt;
Ende;
szText:='positiv zwei, drei, vier, fünf, sechs, sieben, acht, neunzig';
ifiMonth<=10then
beginnen
pBuffer:='';
pBuffer:=pBuffer+Copy(szText,(iMonth-1)*2+1,2);
pBuffer:=pBuffer+'Monat';
Ausfahrt;
Ende;
ifiMonth=11then
pBuffer:='Eleven'
anders
pBuffer:='zwölf';
pBuffer:=pBuffer+'Monat';
Ende;
functionFormatMonth(iMonth:Word;bLunar:Boolean):string;
var
pBuffer: string;
beginnen
FormatMonth(iMonth,pBuffer,bLunar);
Ergebnis:=pBuffer;
Ende;
procedureFormatLunarDay(iDay:Word;varpBuffer:string);
var
szText1,szText2:string;
beginnen
szText1:='Der dreiundzwanzigste Tag des Mondmonats';
szText2:='Eins, zwei, drei, vier, fünf, sechs, sieben, acht, neunzig';
if(iDay<>20)and(iDay<>30)then
beginnen
pBuffer:=Copy(szText1,((iDay-1)div10)*2+1,2);
pBuffer:=pBuffer+Copy(szText2,((iDay-1)mod10)*2+1,2);
Ende
anders
beginnen
pBuffer:=Copy(szText1,(iDaydiv10)*2+1,2);
pBuffer:=pBuffer+'十';
Ende;
Ende;
functionFormatLunarDay(iDay:Word):string;
var
pBuffer: string;
beginnen
FormatLunarDay(iDay,pBuffer);
Ergebnis:=pBuffer;
Ende;
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word;iStartMonth:Word;iStartDay:Word):Longword;
beginnen
Ergebnis:=Trunc(EncodeDate(iEndYear,iEndMonth,iEndDay)-EncodeDate(iStartYear,iStartMonth,iStartDay));
Ende;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;
beginnen
Ergebnis:=Trunc(EndDate-StartDate);
Ende;
procedurel_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
var
tmp:Langwort;
beginnen
//Der 19. Februar 1901 ist im gregorianischen Kalender der erste Tag des ersten Mondmonats im Jahr 1901
//Der Gregorianische Kalender hat vom 1. Januar bis 19. Februar 1901 49 Tage
ifiSpanDays<49dann
beginnen
iYear:=START_YEAR-1;
ifiSpanDays<19dann
beginnen
iMonth:=11;
iDay:=11+Word(iSpanDays);
Ende
anders
beginnen
iMonat:=12;
iDay:=Word(iSpanDays)-18;
Ende;
Ausfahrt;
Ende;
//Die folgenden Berechnungen beginnen mit dem ersten Tag des ersten Mondmonats 1901
iSpanDays:=iSpanDays-49;
iYear:=START_YEAR;
iMonat:=1;
iDay:=1;
//Jahr berechnen
tmp:=LunarYearDays(iYear);
whileiSpanDays>=tmpdo
beginnen
iSpanDays:=iSpanDays-tmp;
Inc(iJahr);
tmp:=LunarYearDays(iYear);
Ende;
//Monat berechnen
tmp:=LoWord(LunarMonthDays(iYear,iMonth));
whileiSpanDays>=tmpdo
beginnen
iSpanDays:=iSpanDays-tmp;
ifiMonth=GetLeapMonth(iYear)then
beginnen
tmp:=HiWord(LunarMonthDays(iYear,iMonth));
ifiSpanDays<tmpthenBreak;
iSpanDays:=iSpanDays-tmp;
Ende;
Inc(iMonth);
tmp:=LoWord(LunarMonthDays(iYear,iMonth));
Ende;
//Tag berechnen
iDay:=iDay+Word(iSpanDays);
Ende;
functionl_GetLunarHolDay(iYear,iMonth,iDay:Word):Word;
var
Flag:Byte;
Tag:Wort;
beginnen
Flag:=gLunarHolDay[(iYear-START_YEAR)*12+iMonth-1];
ifiDay<15thann
Tag:=15-((Flagshr4)and$0f)
anders
Tag:=(Flagand$0f)+15;
ifiDay=Tagdann
ifiDay>15then
Ergebnis:=(iMonth-1)*2+2
anders
Ergebnis:=(iMonth-1)*2+1
anders
Ergebnis:=0;
Ende;
functionGetLunarHolDay(InDate:TDateTime):string;
var
i,iYear,iMonth,iDay:Word;
beginnen
DecodeDate(InDate,iYear,iMonth,iDay);
i:=l_GetLunarHolDay(iYear,iMonth,iDay);
caseiof
1:Ergebnis:='Xiaohan';
2:Ergebnis:='Große Erkältung';
3:Result:='Der Beginn des Frühlings';
4:Ergebnis:='Regen';
5:Ergebnis:='Jingzhe';
6:Ergebnis:='Frühlings-Tagundnachtgleiche';
7:Ergebnis:='Qingming';
8:Ergebnis:='Gu Yu';
9:Ergebnis:='Sommeranfang';
10:Ergebnis:='Xiaoman';
11:Ergebnis:='awn';
12:Ergebnis:='Sommersonnenwende';
13:Ergebnis:='Kleine Hitze';
14:Ergebnis:='Große Hitze';
15:Result:='Der Beginn des Herbstes';
16:Ergebnis:='Ende des Laufs';
17:Ergebnis:='Weißer Tau';
18:Ergebnis:='Herbst-Tagundnachtgleiche';
19:Ergebnis:='Kalter Tau';
20:Ergebnis:='Frost';
21:Ergebnis:='Beginn des Winters';
22:Ergebnis:='Xiaoxue';
23:Ergebnis:='Starker Schneefall';
24:Ergebnis:='Wintersonnenwende';
anders
l_CalcLunarDate(iYear,iMonth,iDay,CalcDateDiff(InDate,EncodeDate(START_YEAR,1,1)));
Ergebnis:=trim(FormatMonth(iMonth)+FormatLunarDay(iDay));
Ende;
Ende;
functionGetLunarHolDay(iYear,iMonth,iDay:Word):string;
beginnen
Ergebnis:=GetLunarHolDay(EncodeDate(iYear,iMonth,iDay));
Ende;
Ende.