const
START_YEAR=1901 ;
END_YEAR=2050 ;
//Renvoie le nombre de jours dans iMois mois de iAnnée année 1 an Janvier---Décembre 65535
functionMonthDays(iYear,iMonth:Word):Word;
// Renvoie le nombre de jours de l'année lunaire iLunarYer et du mois lunaire iLunarMonth Si iLunarMonth est un mois bissextile,
//Le caractère haut est le nombre de jours du deuxième mois iLunarMonth, sinon le caractère haut est janvier 01901 --- décembre 2050
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
//Renvoyer le nombre total de jours dans l'année civile lunaire iLunarYear de janvier 1901 à décembre 2050
functionLunarYearDays(iLunarYear:Word):Word;
//Renvoie le mois bissextile de l'année civile lunaire iLunarYear, sinon renvoie 01901 janvier---décembre 2050
functionGetLeapMonth(iLunarYear:Word):Word;
//Formater iYear en une chaîne représentée par la méthode de notation Tianqian
PRocedureFormatLunarYear(iYear:Word;varpBuffer:string);overload;
functionFormatLunarYear(iYear:Word):string;surcharge;
//Formater iMonth en chaîne chinoise
procédureFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean=True);overload;
functionFormatMonth(iMonth:Word;bLunar:Boolean=True):string;overload;
//Formater iDay en chaîne chinoise
procédureFormatLunarDay(iDay:Word;varpBuffer:string);overload;
functionFormatLunarDay(iDay:Word):string;overload;
//Calculer le nombre de jours entre deux dates du calendrier grégorien : 1er janvier 1 an --- 31 décembre 65535
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word=START_YEAR;iStartMonth:Word=1;iStartDay:Word=1):Longword;overload;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;surcharge;
//Calculez la date lunaire correspondant au iMois mois iDay dans le calendrier grégorien iAnnée, et renvoyez les termes solaires lunaires correspondants 0-24
//1er janvier 1901---31 décembre 2050
functionGetLunarHolDay(InDate:TDateTime):string;surcharge;
functionGetLunarHolDay(iYear,iMonth,iDay:Word):string;overload;
//fonction privée-----------------------------------------
//Calculer la date lunaire après les jours iSpanDays à partir du 1er janvier 1901
procédurel_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
//Calculez les termes solaires 0-24 correspondant à iMonth, iDay, iYear dans le calendrier grégorien, 0 signifie pas un terme solaire
functionl_GetLunarHolDay(iYear,iMonth,iDay:Word):Word;
mise en œuvre
var
//Le tableau gLunarDay stocke le nombre de mois et de jours de chaque année de 1901 à 2100 dans le calendrier lunaire,
//Le calendrier lunaire ne peut avoir que 29 ou 30 jours dans un mois, et une année est représentée par 12 (ou 13) chiffres binaires. Le chiffre correspondant est 1, ce qui signifie 30 jours, sinon c'est 29 jours.
gLunarMonthDay:array[0..149]ofWord=(
//Les données de test sont uniquement 1901.1.1--2050.12.31
4$ae0,$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$,960$c,//2000
$d4a8,$d4a0,$da50,$5aa8,$56a0,$aad8,$25d0,$92d0,$c958,$a950,//2010
$b4a0,$b550,$b550,$55a8,$4ba0,$a5b0,$52b8,$52b0,$a930,$74a8,//2020
6$aa0,$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
//Le tableau gLanarMonth stocke le mois du mois bissextile de 1901 à 2050 dans le calendrier lunaire. S'il n'y a pas de mois bissextile, il vaut 0. Chaque octet est stocké pendant deux ans.
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
//Le tableau gLanarHoliDay stocke les dates du calendrier solaire correspondant aux vingt-quatre termes solaires de chaque année.
//Les dates du calendrier solaire correspondant aux vingt-quatre termes solaires de chaque année sont presque fixes et réparties uniformément dans les douze mois.
//Janvier Février Mars Avril Mai Juin
//Petit froid, grand froid, début du printemps, pluie, équinoxe de printemps, Qingming, pluie de céréales, début de l'été, petite Mandchourie, solstice d'été
//Juillet, Août, Septembre, Octobre, Novembre, Décembre
//Été léger, grosse chaleur, début d'automne, été, rosée blanche, équinoxe d'automne, rosée froide, gel, début d'hiver, neige légère, neige abondante, solstice d'hiver
{*************************************************** ***** ********************************
Il n'y a pas de règles fixes pour les termes solaires, je dois donc conserver les tables pour gagner de la place, alors...
************************************************** * ********************************}
//Description du format de données :
//Par exemple, le terme solaire en 1901 est
//Janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre et décembre
//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
//La première ligne de données ci-dessus est la date correspondant au terme solaire mensuel, 15 moins le premier terme solaire de chaque mois, et le deuxième terme solaire de chaque mois moins 15 pour obtenir la deuxième ligne
//De cette façon, les données correspondantes des deux termes solaires chaque mois sont inférieures à 16, et chaque mois est stocké dans un octet. Le bit haut stocke les premières données du terme solaire et le bit bas les stocke.
//Les données du deuxième terme solaire peuvent être obtenues à partir du tableau suivant
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;
commencer
caseiMonthof
1,3,5,7,8,10,12 :Résultat :=31 ;
4,6,9,11 :Résultat :=30 ;
2://Si c'est une année bissextile
siEstAnnéeLeap(iAnnée)alors
Résultat :=29
autre
Résultat :=28
autre
Résultat :=0 ;
fin;
fin;
functionGetLeapMonth(iLunarYear:Word):Word;
var
Indicateur : octet ;
commencer
Flag:=gLunarMonth[(iLunarYear-START_YEAR)div2];
si (iLunarYear-START_YEAR) mod2 = 0 alors
Résultat :=Flagshr4
autre
Résultat :=Flagand$0F ;
fin;
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
var
Hauteur, Faible : Mot ;
iBit : Entier ;
commencer
ifiLunarYear<START_YEARpuis
commencer
Résultat :=30 ;
Sortie;
fin;
Hauteur :=0 ;
Faible :=29 ;
iBit :=16-iLunarMonth ;
if(iLunarMonth>GetLeapMonth(iLunarYear))et(GetLeapMonth(iLunarYear)>0)then
Déc(iBit);
si(gLunarMonthDay[iLunarYear-START_YEAR]and(1shliBit))>0then
Inc (faible);
ifiLunarMonth=GetLeapMonth(iLunarYear)puis
if(gLunarMonthDay[iLunarYear-START_YEAR]and(1shl(iBit-1)))>0then
Hauteur :=30
autre
Hauteur :=29 ;
Résultat :=MakeLong(Faible,Hauteur);
fin;
functionLunarYearDays(iLunarYear:Word):Word;
var
Jours,i:Mot;
tmp : mot long ;
commencer
Jours :=0 ;
fori:=1à12do
commencer
tmp:=LunarMonthDays(iLunarYear,i);
Jours :=Jours+HiWord(tmp);
Jours :=Jours+LoWord(tmp);
fin;
Résultat :=Jours ;
fin;
procédureFormatLunarYear(iYear:Word;varpBuffer:string);
var
szText1,szText2,szText3:string;
commencer
szText1:='A, B, C, D, Wu, Ji, Geng, Xin, Rengui';
szText2:='Zichou Yinmaochen Siwu n'a pas postulé pour Youxuhai';
szText3:='Rat, bœuf, tigre, dragon, serpent, cheval, mouton, singe, poulet, chien et cochon';
pBuffer:=Copie(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+'année';
fin;
functionFormatLunarYear(iYear:Word):string;
var
pBuffer:chaîne;
commencer
FormatLunarYear(iYear,pBuffer);
Résultat :=pBuffer ;
fin;
procédureFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean);
var
szTexte:chaîne;
commencer
si (notbLunar) et (iMonth = 1) alors
commencer
pBuffer:='Janvier';
Sortie;
fin;
szText:='positif deux, trois, quatre, cinq, six, sept, huit, quatre-vingt-dix';
ifiMois<=10alors
commencer
pBuffer:='';
pBuffer:=pBuffer+Copie(szText,(iMonth-1)*2+1,2);
pBuffer:=pBuffer+'mois';
Sortie;
fin;
ifiMois=11alors
pBuffer :='Onze'
autre
pBuffer:='douze';
pBuffer:=pBuffer+'mois';
fin;
functionFormatMonth(iMonth:Word;bLunar:Boolean):string;
var
pBuffer:chaîne;
commencer
FormatMois(iMois,pBuffer,bLunar);
Résultat :=pBuffer ;
fin;
procédureFormatLunarDay(iDay:Word;varpBuffer:string);
var
szText1,szText2:chaîne;
commencer
szText1:='Le vingt-troisième jour du mois lunaire';
szText2:='un deux trois quatre cinq six sept huit quatre-vingt-dix';
si(iDay<>20)et(iDay<>30)alors
commencer
pBuffer:=Copie(szText1,((iDay-1)div10)*2+1,2);
pBuffer:=pBuffer+Copy(szText2,((iDay-1)mod10)*2+1,2);
fin
autre
commencer
pBuffer:=Copie(szText1,(iDaydiv10)*2+1,2);
pBuffer:=pBuffer+'十';
fin;
fin;
functionFormatLunarDay(iDay:Word):string;
var
pBuffer:chaîne;
commencer
FormatLunarDay(iDay,pBuffer);
Résultat :=pBuffer ;
fin;
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word;iStartMonth:Word;iStartDay:Word):Longword;
commencer
Résultat :=Trunc(EncodeDate(iEndYear,iEndMonth,iEndDay)-EncodeDate(iStartYear,iStartMonth,iStartDay));
fin;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;
commencer
Résultat :=Trunc(EndDate-StartDate);
fin;
procédurel_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
var
tmp : mot long ;
commencer
//Le 19 février 1901 dans le calendrier solaire est le premier jour du premier mois lunaire de 1901 dans le calendrier lunaire
//Il y a 49 jours dans le calendrier grégorien du 1er janvier au 19 février 1901
ifiSpanDays<49then
commencer
iAnnée :=START_YEAR-1 ;
ifiSpanDays<19then
commencer
iMois :=11 ;
iDay:=11+Word(iSpanDays);
fin
autre
commencer
iMois :=12 ;
iDay:=Mot(iSpanDays)-18 ;
fin;
Sortie;
fin;
//Les calculs suivants commencent à partir du premier jour du premier mois lunaire de 1901
iSpanDays :=iSpanDays-49 ;
iAnnée :=START_YEAR ;
iMois :=1 ;
iJour :=1 ;
//calculer l'année
tmp:=LunarYearDays(iYear);
whileiSpanDays>=tmpdo
commencer
iSpanDays :=iSpanDays-tmp ;
Inc(iAnnée);
tmp:=LunarYearDays(iYear);
fin;
//Calculer le mois
tmp:=LoWord(LunarMonthDays(iYear,iMonth));
whileiSpanDays>=tmpdo
commencer
iSpanDays :=iSpanDays-tmp ;
ifiMonth=GetLeapMonth(iYear)puis
commencer
tmp:=HiWord(LunarMonthDays(iYear,iMonth));
ifiSpanDays<tmpthenBreak;
iSpanDays :=iSpanDays-tmp ;
fin;
Inc(iMois);
tmp:=LoWord(LunarMonthDays(iYear,iMonth));
fin;
//Calculer le jour
iDay:=iDay+Word(iSpanDays);
fin;
functionl_GetLunarHolDay(iYear,iMonth,iDay:Word):Word;
var
Indicateur : octet ;
Jour : Mot ;
commencer
Indicateur :=gLunarHolDay[(iYear-START_YEAR)*12+iMonth-1] ;
siJour<15alors
Jour :=15-((Flagshr4)et$0f)
autre
Jour :=(Flagand$0f)+15 ;
ifiDay=Jourpuis
siJour>15alors
Résultat :=(iMois-1)*2+2
autre
Résultat :=(iMois-1)*2+1
autre
Résultat :=0 ;
fin;
functionGetLunarHolDay(InDate:TDateTime):string;
var
i, iAnnée, iMois, iJour : Mot ;
commencer
DecodeDate (InDate, iYear, iMonth, iDay);
i:=l_GetLunarHolDay(iYear,iMonth,iDay);
cas de cas
1:Résultat :='Xiaohan';
2:Résultat:='Grand Froid';
3:Result:='Le début du printemps';
4:Résultat :='Pluie';
5:Résultat :='Jingzhe';
6:Résultat :='Équinoxe vernal';
7:Résultat :='Qingming';
8 :Résultat :='Gu Yu';
9:Result:='Début de l'été';
10:Résultat :='Xiaoman';
11:Résultat :='espèce d'aube';
12:Résultat:='Solstice d'été';
13:Résultat :='Peu de chaleur';
14:Résultat:='Grande Chaleur';
15:Result:='Le début de l'automne';
16:Résultat :='Fin de la manche';
17:Résultat :='Rosée Blanche';
18:Résultat :='Équinoxe d'automne';
19:Résultat:='Rosée froide';
20:Résultat:='Givre';
21:Résultat :='Début de l'hiver';
22:Résultat :='Xiaoxue';
23:Résultat:='Forte neige';
24:Résultat:='Solstice d'hiver';
autre
l_CalcLunarDate(iYear,iMonth,iDay,CalcDateDiff(InDate,EncodeDate(START_YEAR,1,1)));
Résultat :=trim(FormatMonth(iMonth)+FormatLunarDay(iDay));
fin;
fin;
functionGetLunarHolDay(iYear,iMonth,iDay:Word):string;
commencer
Résultat :=GetLunarHolDay(EncodeDate(iYear,iMonth,iDay));
fin;
fin.