const
START_ANO=1901;
END_ANO=2050;
//Retorna o número de dias em iMonth mês de iYear ano 1 ano janeiro---dezembro 65535
functionMonthDays(iAno,iMês:Palavra):Palavra;
//Retorna o número de dias do ano lunar iLunarYer ano e o mês lunar iLunarMonth Se iLunarMonth for um mês bissexto,
//O caractere alto é o número de dias no segundo mês iLunarMonth, caso contrário, o caractere alto é janeiro 01901---dezembro de 2050
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
//Retorna o número total de dias no ano civil lunar iLunarYear de janeiro de 1901 a dezembro de 2050
functionLunarYearDays(iLunarYear:Word):Word;
//Retorna o mês bissexto do ano civil lunar iLunarYear, se não retornar 01901 Janeiro---Dezembro de 2050
functionGetLeapMonth(iLunarYear:Word):Word;
//Formatar iYear em uma string representada pelo método de notação Tianqian
PRocedureFormatLunarYear(iYear:Word;varpBuffer:string);sobrecarga;
functionFormatLunarYear(iYear:Word):string;sobrecarga;
//Formatar iMonth em string chinesa
procedureFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean=True);sobrecarga;
functionFormatMonth(iMonth:Word;bLunar:Boolean=True):string;sobrecarga;
//Formatar iDay em string chinesa
procedureFormatLunarDay(iDay:Word;varpBuffer:string);sobrecarga;
functionFormatLunarDay(iDay:Word):string;sobrecarga;
//Calcula o número de dias entre duas datas no calendário gregoriano: 1º de janeiro de 1 ano ---31 de dezembro de 65535
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word=START_YEAR;iStartMonth:Word=1;iStartDay:Word=1):Longword;sobrecarga;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;sobrecarga;
//Calcula a data lunar correspondente ao mês iMonth iDay no calendário gregoriano iYear e retorna os termos solares lunares correspondentes 0-24
//1º de janeiro de 1901 --- 31 de dezembro de 2050
functionGetLunarHolDay(InDate:TDateTime):string;sobrecarga;
functionGetLunarHolDay(iYear,iMonth,iDay:Word):string;sobrecarga;
//função privada--------------------------------------------
//Calcula a data lunar após dias iSpanDays a partir de 1º de janeiro de 1901
procedimentol_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
//Calcula os termos solares 0-24 correspondentes a iMonth, iDay, iYear no calendário gregoriano, 0 significa que não é um termo solar
functionl_GetLunarHolDay(iAno,iMês,iDia:Palavra):Palavra;
implementação
var
//A matriz gLunarDay armazena o número de meses e dias de cada ano de 1901 a 2100 no calendário lunar,
//O calendário lunar só pode ter 29 ou 30 dias em um mês, e um ano é representado por 12 (ou 13) dígitos binários. O dígito correspondente é 1, o que significa 30 dias, caso contrário são 29 dias.
gLunarMonthDay:array[0..149]ofWord=(
//Os dados de teste são apenas 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
//A matriz gLanarMonth armazena o mês do mês bissexto de 1901 a 2050 no calendário lunar. Se não houver mês bissexto, será 0. Cada byte é armazenado por dois anos.
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
//A matriz gLanarHoliDay armazena as datas do calendário solar correspondentes aos vinte e quatro termos solares de cada ano.
//As datas do calendário solar correspondentes aos vinte e quatro termos solares de cada ano são quase fixas e distribuídas uniformemente nos doze meses.
//Janeiro Fevereiro Março Abril Maio Junho
// Frio Pequeno, Frio Grande, Início da Primavera, Chuva, Equinócio da Primavera, Qingming, Chuva de Grãos, Início do Verão, Pequena Manchúria, Solstício de Verão
//Julho, agosto, setembro, outubro, novembro, dezembro
//Leve verão, grande calor, início do outono, verão, orvalho branco, equinócio de outono, orvalho frio, geada, início do inverno, neve fraca, neve forte, solstício de inverno
{************************************************* **************************************
Não existem regras fixas para termos solares, então tenho que guardar tabelas para economizar espaço, então...
************************************************** **********************************}
//Descrição do formato dos dados:
//Por exemplo, o termo solar em 1901 é
//Janeiro, fevereiro, março, abril, maio, junho, julho, agosto, setembro, outubro, novembro e dezembro
//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
//A primeira linha de dados acima é a data correspondente ao termo solar mensal, 15 menos o primeiro termo solar de cada mês, e o segundo termo solar de cada mês menos 15 para obter a segunda linha
//Desta forma, os dados correspondentes dos dois termos solares de cada mês são menores que 16, e cada mês é armazenado em um byte. O bit alto armazena os dados do primeiro termo solar e o bit baixo os armazena.
//Os dados do segundo termo solar podem ser obtidos na tabela a seguir
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(iAno,iMês:Palavra):Palavra;
começar
caseiMonthof
1,3,5,7,8,10,12:Resultado:=31;
4,6,9,11:Resultado:=30;
2://Se for um ano bissexto
ifIsLeapYear(iYear)então
Resultado:=29
outro
Resultado:=28
outro
Resultado:=0;
fim;
fim;
functionGetLeapMonth(iLunarYear:Word):Word;
var
Bandeira:Byte;
começar
Sinalizador:=gLunarMonth[(iLunarYear-START_YEAR)div2];
if(iLunarYear-START_YEAR)mod2=0então
Resultado:=Flagshr4
outro
Resultado:=Sinalizador$0F;
fim;
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
var
Altura, Baixa: Palavra;
iBit:Inteiro;
começar
ifiLunarYear<START_YEARentão
começar
Resultado:=30;
Saída;
fim;
Altura:=0;
Baixo:=29;
iBit:=16-iMês Lunar;
if(iLunarMonth>GetLeapMonth(iLunarYear))e(GetLeapMonth(iLunarYear)>0)então
Dez(iBit);
if(gLunarMonthDay[iLunarYear-START_YEAR]e(1shliBit))>0então
Inc(Baixo);
ifiLunarMonth=GetLeapMonth(iLunarYear)então
if(gLunarMonthDay[iLunarYear-START_YEAR]e(1shl(iBit-1)))>0então
Altura:=30
outro
Altura:=29;
Resultado:=MakeLong(Baixo,Altura);
fim;
functionLunarYearDays(iLunarYear:Word):Word;
var
Dias,i:Palavra;
tmp: Palavra longa;
começar
Dias:=0;
fori:=1to12fazer
começar
tmp:=DiasMêsLunar(iAnoLunar,i);
Dias:=Dias+HiWord(tmp);
Dias:=Dias+LoWord(tmp);
fim;
Resultado:=Dias;
fim;
procedimentoFormatLunarYear(iYear:Word;varpBuffer:string);
var
szText1,szText2,szText3:string;
começar
szText1:='A, B, C, D, Wu, Ji, Geng, Xin, Rengui';
szText2:='Zichou Yinmaochen Siwu não se inscreveu para Youxuhai';
szText3:='Rato, boi, tigre, dragão, cobra, cavalo, ovelha, macaco, galinha, cachorro e porco';
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+'ano';
fim;
functionFormatLunarYear(iYear:Word):string;
var
pBuffer:string;
começar
FormatLunarAno(iAno,pBuffer);
Resultado:=pBuffer;
fim;
procedureFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean);
var
szText:string;
começar
if(notbLunar)e(iMonth=1)então
começar
pBuffer:='Janeiro';
Saída;
fim;
szText:='positivo dois, três, quatro, cinco, seis, sete, oito, noventa';
ifiMês<=10então
começar
pBuffer:='';
pBuffer:=pBuffer+Copy(szText,(iMonth-1)*2+1,2);
pBuffer:=pBuffer+'mês';
Saída;
fim;
ifiMês=11então
pBuffer:='Onze'
outro
pBuffer:='doze';
pBuffer:=pBuffer+'mês';
fim;
functionFormatMonth(iMonth:Word;bLunar:Boolean):string;
var
pBuffer:string;
começar
FormatMês(iMês,pBuffer,bLunar);
Resultado:=pBuffer;
fim;
procedimentoFormatLunarDay(iDay:Word;varpBuffer:string);
var
szText1,szText2:string;
começar
szText1:='O vigésimo terceiro dia do mês lunar';
szText2:='um dois três quatro cinco seis sete oito noventa';
if(iDia<>20)e(iDia<>30)então
começar
pBuffer:=Copiar(szText1,((iDay-1)div10)*2+1,2);
pBuffer:=pBuffer+Copy(szText2,((iDay-1)mod10)*2+1,2);
fim
outro
começar
pBuffer:=Copiar(szText1,(iDaydiv10)*2+1,2);
pBuffer:=pBuffer+'十';
fim;
fim;
functionFormatLunarDay(iDay:Word):string;
var
pBuffer:string;
começar
FormatLunarDay(iDay,pBuffer);
Resultado:=pBuffer;
fim;
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word;iStartMonth:Word;iStartDay:Word):Longword;
começar
Resultado:=Trunc(EncodeDate(iEndYear,iEndMonth,iEndDay)-EncodeDate(iStartYear,iStartMonth,iStartDay));
fim;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;
começar
Resultado:=Trunc(EndDate-StartDate);
fim;
procedimentol_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
var
tmp: Palavra longa;
começar
//19 de fevereiro de 1901 no calendário solar é o primeiro dia do primeiro mês lunar de 1901 no calendário lunar
//Há 49 dias no calendário gregoriano de 1º de janeiro a 19 de fevereiro de 1901
ifiSpanDays<49então
começar
iAno:=START_YEAR-1;
ifiSpanDays<19então
começar
iMês:=11;
iDia:=11+Word(iSpanDays);
fim
outro
começar
iMês:=12;
iDia:=Palavra(iSpanDays)-18;
fim;
Saída;
fim;
//Os cálculos a seguir começam no primeiro dia do primeiro mês lunar de 1901
iSpanDays:=iSpanDays-49;
iAno:=START_YEAR;
iMês:=1;
iDia:=1;
//calcula o ano
tmp:=DiasAnoLunar(iAno);
whileiSpanDays>=tmpdo
começar
iSpanDays:=iSpanDays-tmp;
Inc(iAno);
tmp:=DiasAnoLunar(iAno);
fim;
//Calcula o mês
tmp:=LoWord(LunarMonthDays(iAno,iMês));
whileiSpanDays>=tmpdo
começar
iSpanDays:=iSpanDays-tmp;
ifiMonth=GetLeapMonth(iYear)então
começar
tmp:=HiWord(LunarMonthDays(iAno,iMês));
ifiSpanDays<tmpthenBreak;
iSpanDays:=iSpanDays-tmp;
fim;
Inc(iMês);
tmp:=LoWord(LunarMonthDays(iAno,iMês));
fim;
//Calcula o dia
iDia:=iDia+Word(iSpanDays);
fim;
functionl_GetLunarHolDay(iAno,iMês,iDia:Palavra):Palavra;
var
Bandeira:Byte;
Dia:Palavra;
começar
Sinalizador:=gLunarHolDay[(iYear-START_YEAR)*12+iMonth-1];
ifiDia<15então
Dia:=15-((Flagshr4)e$0f)
outro
Dia:=(Flagand$0f)+15;
ifiDay=Diaentão
ifiDia>15então
Resultado:=(iMês-1)*2+2
outro
Resultado:=(iMês-1)*2+1
outro
Resultado:=0;
fim;
functionGetLunarHolDay(InDate:TDateTime):string;
var
i,iAno,iMês,iDia:Palavra;
começar
DecodeDate(InDate,iAno,iMês,iDia);
i:=l_GetLunarHolDay(iAno,iMês,iDia);
caseiof
1:Resultado:='Xiaohan';
2:Resultado:='Grande Frio';
3:Resultado:='O Início da Primavera';
4:Resultado:='Chuva';
5:Resultado:='Jingzhe';
6:Resultado:='Equinócio Vernal';
7:Resultado:='Qingming';
8:Resultado:='Gu Yu';
9:Resultado:='Início do Verão';
10:Resultado:='Xiaoman';
11:Resultado:='espécie de awn';
12:Resultado:='Solstício de Verão';
13:Resultado:='Pouco Calor';
14:Resultado:='Grande Calor';
15:Resultado:='O Início do Outono';
16:Resultado:='Fim da bateria';
17:Resultado:='Orvalho Branco';
18:Resultado:='Equinócio de Outono';
19:Resultado:='Orvalho Frio';
20:Resultado:='Geada';
21:Resultado:='Início do Inverno';
22:Resultado:='Xiaoxue';
23:Resultado:='Neve Forte';
24:Resultado:='Solstício de Inverno';
outro
l_CalcLunarDate(iYear,iMonth,iDay,CalcDateDiff(InDate,EncodeDate(START_YEAR,1,1)));
Resultado:=trim(FormatMonth(iMonth)+FormatLunarDay(iDay));
fim;
fim;
functionGetLunarHolDay(iAno,iMês,iDia:Palavra):string;
começar
Resultado:=GetLunarHolDay(EncodeDate(iYear,iMonth,iDay));
fim;
fim.