constante
START_AÑO=1901;
FIN_AÑO=2050;
//Devuelve el número de días en iMonth mes de iYear año 1 año enero---diciembre 65535
funciónMesDías(iAño,iMes:Palabra):Palabra;
//Devuelve el número de días del año lunar iLunarYer año y el mes lunar iLunarMonth Si iLunarMonth es un mes bisiesto,
//El carácter alto es el número de días en el segundo mes iLunarMonth; de lo contrario, el carácter alto es enero 01901---diciembre 2050
funciónLunarMonthDays(iLunarYear,iLunarMonth:Palabra):Palabra larga;
//Devuelve el número total de días del año calendario lunar iLunarYear desde enero de 1901 hasta diciembre de 2050
functionLunarYearDays(iLunarYear:Palabra):Palabra;
// Devuelve el mes bisiesto del año calendario lunar iLunarYear, si no, devuelve 01901 enero---diciembre de 2050
functionGetLeapMonth(iLunarYear:Palabra):Palabra;
//Formatea iYear en una cadena representada por el método de notación Tianqian
PROcedureFormatLunarYear(iYear:Word;varpBuffer:string);sobrecarga;
functionFormatLunarYear(iYear:Word):cadena;sobrecarga;
//Formatear iMonth en cadena china
procedimientoFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean=True);sobrecarga;
functionFormatMonth(iMonth:Word;bLunar:Boolean=True):cadena;sobrecarga;
//Formatear iDay en cadena china
procedimientoFormatLunarDay(iDay:Word;varpBuffer:string);sobrecarga;
functionFormatLunarDay(iDay:Word):cadena;sobrecarga;
//Calcula el número de días entre dos fechas en el calendario gregoriano: 1 de enero de 1 año---31 de diciembre de 65535
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word=START_YEAR;iStartMonth:Word=1;iStartDay:Word=1):Longword;sobrecarga;
funciónCalcDateDiff(Fecha de finalización,Fecha de inicio:TDateTime):Palabra larga;sobrecarga;
// Calcula la fecha lunar correspondiente a iMonth mes iDay en el calendario gregoriano iYear y devuelve los términos solares lunares correspondientes 0-24
//1 de enero de 1901---31 de diciembre de 2050
funciónGetLunarHolDay(InDate:TDateTime):cadena;sobrecarga;
funciónGetLunarHolDay(iAño,iMes,iDía:Palabra):cadena;sobrecarga;
//función privada-----------------------------------------
//Calcular la fecha lunar después de los días iSpanDays del 1 de enero de 1901
procedimientol_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
//Calcula los términos solares 0-24 correspondientes a iMonth, iDay, iYear en el calendario gregoriano, 0 significa que no es un término solar
functionl_GetLunarHolDay(iAño,iMes,iDía:Palabra):Palabra;
implementación
var
//La matriz gLunarDay almacena el número de meses y días de cada año desde 1901 hasta 2100 en el calendario lunar.
// El calendario lunar solo puede tener 29 o 30 días en un mes, y un año está representado por 12 (o 13) dígitos binarios. El dígito correspondiente es 1, que significa 30 días; de lo contrario, son 29 días.
gLunarMonthDay:matriz[0..149]ofWord=(
//Los datos de prueba son solo 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
// La matriz gLanarMonth almacena el mes bisiesto de 1901 a 2050 en el calendario lunar. Si no hay mes bisiesto, es 0. Cada byte se almacena durante dos años.
gLunarMonth:matriz[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
//La matriz gLanarHoliDay almacena las fechas del calendario solar correspondientes a los veinticuatro términos solares de cada año.
//Las fechas del calendario solar correspondientes a los veinticuatro términos solares de cada año son casi fijas y uniformemente distribuidas en los doce meses.
//Enero Febrero Marzo Abril Mayo Junio
//Pequeño Frío, Gran Frío, Comienzo de Primavera, Lluvia, Equinoccio de Primavera, Qingming, Lluvia de Granos, Comienzo de Verano, Pequeña Manchuria, Solsticio de Verano
//Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre
//Verano ligero, mucho calor, comienzo de otoño, verano, rocío blanco, equinoccio de otoño, rocío frío, heladas, comienzo de invierno, nieve ligera, nieve intensa, solsticio de invierno
{*************************************************** ***** **********************************
No hay reglas fijas para los términos solares, así que tengo que guardar tablas para ahorrar espacio, así que...
************************************************** * **********************************}
//Descripción del formato de datos:
//Por ejemplo, el término solar en 1901 es
//Enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre y diciembre
//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 primera fila de datos de arriba es la fecha correspondiente al término solar mensual, 15 menos el primer término solar de cada mes y el segundo término solar de cada mes menos 15 para obtener la segunda fila
// De esta manera, los datos correspondientes de los dos términos solares cada mes son menos de 16, y cada mes se almacena en un byte. El bit alto almacena los datos del primer término solar y el bit bajo los almacena.
//Los datos del segundo término solar se pueden obtener de la siguiente tabla
gLunarHolDay:matriz[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
funciónMesDías(iAño,iMes:Palabra):Palabra;
comenzar
caseiMonhof
1,3,5,7,8,10,12:Resultado:=31;
4,6,9,11:Resultado:=30;
2://Si es año bisiesto
si es año bisiesto (i año) entonces
Resultado:=29
demás
Resultado:=28
demás
Resultado:=0;
fin;
fin;
functionGetLeapMonth(iLunarYear:Palabra):Palabra;
var
Bandera:Byte;
comenzar
Bandera:=gLunarMonth[(iLunarYear-START_YEAR)div2];
si(iLunarYear-START_YEAR)mod2=0entonces
Resultado:=Banderashr4
demás
Resultado:=Banderay$0F;
fin;
funciónLunarMonthDays(iLunarYear,iLunarMonth:Palabra):Palabra larga;
var
Altura,Baja:Palabra;
iBit:Entero;
comenzar
ifiAñoLunar<START_YEARentonces
comenzar
Resultado:=30;
Salida;
fin;
Altura:=0;
Bajo:=29;
iBit:=16-iLunarMes;
si (iLunarMonth>GetLeapMonth(iLunarYear)) y (GetLeapMonth(iLunarYear)>0) entonces
Dec(iBit);
if(gLunarMonthDay[iLunarYear-START_YEAR]y(1shliBit))>0entonces
Inc(Bajo);
ifiLunarMonth=GetLeapMonth(iLunarYear)entonces
if(gLunarMonthDay[iLunarYear-START_YEAR]y(1shl(iBit-1)))>0entonces
Altura:=30
demás
Altura:=29;
Resultado:=HacerLargo(Bajo,Alto);
fin;
functionLunarYearDays(iLunarYear:Palabra):Palabra;
var
Días,i:Palabra;
tmp:palabra larga;
comenzar
Días:=0;
fori:=1to12do
comenzar
tmp:=DíasMesLunar(iAñoLunar,i);
Días:=Días+HolaPalabra(tmp);
Días:=Días+LoWord(tmp);
fin;
Resultado:=Días;
fin;
procedimientoFormatLunarYear(iYear:Word;varpBuffer:string);
var
szText1,szText2,szText3:cadena;
comenzar
szText1:='A, B, C, D, Wu, Ji, Geng, Xin, Rengui';
szText2:='Zichou Yinmaochen Siwu no ha solicitado Youxuhai';
szText3:='Rata, buey, tigre, dragón, serpiente, caballo, oveja, mono, gallina, perro y cerdo';
pBuffer:=Copiar(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+'año';
fin;
functionFormatLunarYear(iAño:Palabra):cadena;
var
pBuffer:cadena;
comenzar
FormatoAñoLunar(iAño,pBuffer);
Resultado:=pBuffer;
fin;
procedimientoFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean);
var
szText:cadena;
comenzar
si (notbLunar) y (iMonth = 1) entonces
comenzar
pBuffer:='Enero';
Salida;
fin;
szText:='positivo dos, tres, cuatro, cinco, seis, siete, ocho, noventa';
siMes<=10entonces
comenzar
pBuffer:='';
pBuffer:=pBuffer+Copy(szText,(iMonth-1)*2+1,2);
pBuffer:=pBuffer+'mes';
Salida;
fin;
ifiMes=11entonces
pBuffer:='Once'
demás
pBuffer:='doce';
pBuffer:=pBuffer+'mes';
fin;
functionFormatMonth(iMonth:Word;bLunar:Boolean):string;
var
pBuffer:cadena;
comenzar
FormatoMes(iMes,pBuffer,bLunar);
Resultado:=pBuffer;
fin;
procedimientoFormatLunarDay(iDay:Word;varpBuffer:string);
var
szText1,szText2:cadena;
comenzar
szText1:='El vigésimo tercer día del mes lunar';
szText2:='uno dos tres cuatro cinco seis siete ocho noventa';
si (iDía<>20) y (iDía<>30)entonces
comenzar
pBuffer:=Copiar(szText1,((iDay-1)div10)*2+1,2);
pBuffer:=pBuffer+Copy(szText2,((iDay-1)mod10)*2+1,2);
fin
demás
comenzar
pBuffer:=Copiar(szText1,(iDaydiv10)*2+1,2);
pBuffer:=pBuffer+'十';
fin;
fin;
functionFormatLunarDay(iDay:Word):cadena;
var
pBuffer:cadena;
comenzar
FormatLunarDay(iDay,pBuffer);
Resultado:=pBuffer;
fin;
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word;iStartMonth:Word;iStartDay:Word):Longword;
comenzar
Resultado:=Trunc(EncodeDate(iEndYear,iEndMonth,iEndDay)-EncodeDate(iStartYear,iStartMonth,iStartDay));
fin;
funciónCalcDateDiff(Fecha de finalización,Fecha de inicio:TDateTime):Palabra larga;
comenzar
Resultado:=Trunc(FechaFinal-FechaInicio);
fin;
procedimientol_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
var
tmp:palabra larga;
comenzar
//El 19 de febrero de 1901 en el calendario solar es el primer día del primer mes lunar de 1901 en el calendario lunar.
//Hay 49 días en el calendario gregoriano del 1 de enero al 19 de febrero de 1901
ifiSpanDays<49entonces
comenzar
iAño:=START_YEAR-1;
ifiSpanDays<19entonces
comenzar
iMes:=11;
iDay:=11+Palabra(iSpanDays);
fin
demás
comenzar
iMes:=12;
iDay:=Palabra(iSpanDays)-18;
fin;
Salida;
fin;
//Los siguientes cálculos comienzan desde el primer día del primer mes lunar de 1901
iSpanDays:=iSpanDays-49;
iAño:=START_AÑO;
iMes:=1;
iDía:=1;
//calcular año
tmp:=LunarYearDays(iAño);
mientrasiSpanDays>=tmpdo
comenzar
iSpanDays:=iSpanDays-tmp;
Inc(iAño);
tmp:=LunarYearDays(iAño);
fin;
//Calcular mes
tmp:=LoWord(LunarMonthDays(iAño,iMes));
mientrasiSpanDays>=tmpdo
comenzar
iSpanDays:=iSpanDays-tmp;
ifiMonth=GetLeapMonth(iAño)entonces
comenzar
tmp:=HolaPalabra(LunarMonthDays(iAño,iMes));
ifiSpanDays<tmpthenBreak;
iSpanDays:=iSpanDays-tmp;
fin;
Inc(iMes);
tmp:=LoWord(LunarMonthDays(iAño,iMes));
fin;
//Calcular el día
iDay:=iDay+Word(iSpanDays);
fin;
functionl_GetLunarHolDay(iAño,iMes,iDía:Palabra):Palabra;
var
Bandera:Byte;
Día:Palabra;
comenzar
Bandera:=gLunarHolDay[(iYear-START_YEAR)*12+iMonth-1];
siDia<15entonces
Día:=15-((Flagshr4)y$0f)
demás
Día:=(Banderaand$0f)+15;
ifiDía=Díaentonces
siDía>15entonces
Resultado:=(iMes-1)*2+2
demás
Resultado:=(iMes-1)*2+1
demás
Resultado:=0;
fin;
funciónGetLunarHolDay(InDate:TDateTime):cadena;
var
i,iAño,iMes,iDía:Palabra;
comenzar
DecodeDate(InDate,iAño,iMes,iDía);
i:=l_GetLunarHolDay(iAño,iMes,iDía);
caseiof
1:Resultado:='Xiaohan';
2:Resultado:='Gran Frío';
3:Resultado:='El comienzo de la primavera';
4:Resultado:='Lluvia';
5:Resultado:='Jingzhe';
6:Resultado:='Equinoccio de primavera';
7:Resultado:='Qingming';
8:Resultado:='Gu Yu';
9:Resultado:='Inicio del Verano';
10:Resultado:='Xiaoman';
11:Resultado:='especie de arista';
12:Resultado:='Solsticio de verano';
13:Resultado:='Poco Calor';
14:Resultado:='Gran Calor';
15:Resultado:='El comienzo del otoño';
16:Resultado:='Fin del celo';
17:Resultado:='Rocío Blanco';
18:Resultado:='Equinoccio de Otoño';
19:Resultado:='Rocío Frío';
20:Resultado:='Escarcha';
21:Resultado:='Comienzo del invierno';
22:Resultado:='Xiaoxue';
23:Resultado:='Nieve intensa';
24:Resultado:='Solsticio de Invierno';
demás
l_CalcLunarDate(iAño,iMes,iDía,CalcDateDiff(InDate,EncodeDate(START_YEAR,1,1)));
Resultado:=recortar(FormatMonth(iMonth)+FormatLunarDay(iDay));
fin;
fin;
funciónGetLunarHolDay(iAño,iMes,iDía:Palabra):cadena;
comenzar
Resultado:=GetLunarHolDay(EncodeDate(iAño,iMes,iDía));
fin;
fin.