константа
START_YEAR=1901;
КОНЕЦ_ГОД=2050;
//Вернем количество дней в месяце iMonth года iYear года 1 января---декабря 65535
functionMonthDays(iYear,iMonth:Word):Word;
//Возвращает количество дней в лунном году iLunarYeryear и лунном месяце iLunarMonth. Если iLunarMonth — високосный месяц,
//Старшее слово — это количество дней во втором месяце iLunarMonth, в противном случае старшее слово — это 01901 января — декабрь 2050.
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
//Вернем общее количество дней в лунном календарном году iLunarYear с января 1901 по декабрь 2050 года.
functionLunarYearDays(iLunarYear:Word):Word;
//Вернем високосный месяц лунного календарного года iLunarYear, если не вернем январь 01901---декабрь 2050
functionGetLeapMonth(iLunarYear:Word):Word;
//Форматируем iYear в строку, представленную методом нотации Tianqian
PROcedureFormatLunarYear(iYear:Word;varpBuffer:string);overload;
functionFormatLunarYear(iYear:Word):строка;перегрузка;
//Форматируем iMonth в китайскую строку
процедураFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean=True);overload;
functionFormatMonth(iMonth:Word;bLunar:Boolean=True):строка;перегрузка;
//Форматируем iDay в китайскую строку
процедураFormatLunarDay (iDay: Word; varpBuffer: строка); перегрузка;
functionFormatLunarDay(iDay:Word):строка;перегрузка;
//Вычисляем количество дней между двумя датами по григорианскому календарю: 1 января 1 года --- 31 декабря 65535 г.
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word=START_YEAR;iStartMonth:Word=1;iStartDay:Word=1):Longword;overload;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;overload;
//Вычисляем лунную дату, соответствующую месяцу iMonth iDay в григорианском календаре iYear, и возвращаем соответствующие лунные солнечные условия 0-24
//1 января 1901 г. --- 31 декабря 2050 г.
functionGetLunarHolDay(InDate:TDateTime):строка;перегрузка;
functionGetLunarHolDay(iYear,iMonth,iDay:Word):строка;перегрузка;
//частная функция-----------------------------------------
//Рассчитать лунную дату после iSpanDays дней с 1 января 1901 г.
процедураl_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
//Рассчитываем солнечные термины 0–24, соответствующие iMonth, iDay, iYear в григорианском календаре, 0 означает отсутствие солнечного термина
functionl_GetLunarHolDay(iYear,iMonth,iDay:Word):Word;
выполнение
вар
//Массив gLunarDay хранит количество месяцев и дней в каждом году с 1901 по 2100 в лунном календаре,
//В лунном календаре в месяце может быть только 29 или 30 дней, а год представлен 12 (или 13) двоичными цифрами. Соответствующая цифра равна 1, что означает 30 дней, в противном случае — 29 дней.
gLunarMonthDay:array[0..149]ofWord=(
//Тестовые данные только 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$, 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
$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
//Массив gLanarMonth хранит месяц високосного месяца с 1901 по 2050 год в лунном календаре. Если високосного месяца нет, то он будет равен 0. Каждый байт хранится два года.
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
//Массив gLanarHoliDay хранит даты солнечного календаря, соответствующие двадцати четырем солнечным срокам каждого года.
//Даты солнечного календаря, соответствующие двадцати четырем солнечным срокам каждого года, почти фиксированы и равномерно распределены по двенадцати месяцам.
//Январь, февраль, март, апрель, май, июнь
//Малый холод, Большой холод, Начало весны, Дождь, Весеннее равноденствие, Цинмин, Зерновой дождь, Начало лета, Малая Маньчжурия, Летнее солнцестояние
//Июль, август, сентябрь, октябрь, ноябрь, декабрь
//Небольшое лето, большая жара, начало осени, лето, белая роса, осеннее равноденствие, холодная роса, иней, начало зимы, небольшой снег, сильный снег, зимнее солнцестояние
{************************************************ * ********************************
Для солнечных терминов нет четких правил, поэтому мне приходится сохранять таблицы, чтобы сэкономить место, так что...
************************************************* * *********************************}
//Описание формата данных:
//Например, солнечный термин в 1901 году равен
//Январь, февраль, март, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь, декабрь
//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, и каждый месяц хранится в одном байте. Старший бит хранит данные первого солнечного термина, а младший бит хранит их.
//Данные второго солнечного периода можно получить из следующей таблицы
gLunarHolDay:array[0..1799]ofByte=(
$96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77, //1901
96 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 87 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1902 г.
96 долларов, А5, 87 долларов, 96 долларов, 87 долларов, 87 долларов, 79 долларов, 69 долларов, 69 долларов, 69 долларов, 78 долларов, 78 долларов, // 1903 год.
86 долларов, А5, 96 долларов, А5, 96 долларов, 97 долларов, 88 долларов, 78 долларов, 78 долларов, 79 долларов, 78 долларов, 87 долларов, // 1904 год.
$96,$B4,$96,$A6,$97,$97,$78,$79,$79,$69,$78,$77,//1905
96 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 97 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1906 г.
96 долларов, А5, 87 долларов, 96 долларов, 87 долларов, 87 долларов, 79 долларов, 69 долларов, 69 долларов, 69 долларов, 78 долларов, 78 долларов, // 1907 год.
86 долларов, А5, 96 долларов, А5, 96 долларов, 97 долларов, 88 долларов, 78 долларов, 78 долларов, 69 долларов, 78 долларов, 87 долларов, // 1908 год.
$96, $B4, $96, $A6, $97, $97, $78, $79, $79, $69, $78, $77, //1909
96 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 97 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1910 г.
96 долларов, А5, 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 долларов, А5, 97 долларов, 96 долларов, 97 долларов, 87 долларов, 79 долларов, 79 долларов, 69 долларов, 69 долларов, 78 долларов, 78 долларов, // 1915 г.
96 долларов, А5, 96 долларов, А5, 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 долларов, А5, 97 долларов, 96 долларов, 97 долларов, 87 долларов, 79 долларов, 79 долларов, 69 долларов, 69 долларов, 78 долларов, 78 долларов, // 1919 год.
96 долларов, А5, 96 долларов, А5, 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 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 87 долларов, 79 долларов, 79 долларов, 69 долларов, 69 долларов, 78 долларов, 78 долларов, // 1923 год.
96 долларов, А5, 96 долларов, А5, 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 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 87 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1927 год.
96 долларов, А5, 96 долларов, А5, 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 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 87 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1931 год.
96 долларов, А5, 96 долларов, А5, 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 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 97 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1935 год.
96 долларов, А5, 96 долларов, А5, 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 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 97 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1939 год.
96 долларов, А5, 96 долларов, А5, 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 долларов, А4, 96 долларов, 96 долларов, 97 долларов, 97 долларов, 79 долларов, 79 долларов, 79 долларов, 69 долларов, 78 долларов, 78 долларов, // 1943 год.
96 долларов, А5, 96 долларов, А5, А6, 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 долларов, А5, А6, А5, А6, 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 долларов, А5, А6, А5, А6, 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 долларов, А5, А5, А5, А6, 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 долларов, А4, А5, А5, А6, 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 долларов, А4, А5, А5, А6, 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 долларов, А4, А5, А5, А6, А6, 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;
начинать
чехолiMonthof
1,3,5,7,8,10,12:Результат:=31;
4,6,9,11:Результат:=30;
2://Если год високосный
еслиIsLeapYear(iYear), то
Результат:=29
еще
Результат:=28
еще
Результат:=0;
конец;
конец;
functionGetLeapMonth(iLunarYear:Word):Word;
вар
Флаг: Байт;
начинать
Флаг:=gLunarMonth[(iLunarYear-START_YEAR)div2];
если(iLunarYear-START_YEAR)mod2=0то
Результат: = Флагшр4
еще
Результат:=Flagand$0F;
конец;
functionLunarMonthDays(iLunarYear,iLunarMonth:Word):Longword;
вар
Высота, Низкая: Слово;
iBit: целое число;
начинать
ifiLunarYear<START_YEARто
начинать
Результат:=30;
Выход;
конец;
Высота:=0;
Низкий:=29;
iBit:=16-iLunarMonth;
если(iLunarMonth>GetLeapMonth(iLunarYear)) и (GetLeapMonth(iLunarYear)>0), то
Декабрь (иБит);
если(gLunarMonthDay[iLunarYear-START_YEAR]и(1shliBit))>0то
Inc (Низкий);
ifiLunarMonth=GetLeapMonth(iLunarYear), затем
if(gLunarMonthDay[iLunarYear-START_YEAR]and(1shl(iBit-1)))>0then
Высота:=30
еще
Высота:=29;
Результат:=MakeLong(Low,Height);
конец;
functionLunarYearDays(iLunarYear:Word):Word;
вар
Дни, я: Слово;
tmp: длинное слово;
начинать
Дни:=0;
fori:=1to12do
начинать
tmp:=LunarMonthDays(iLunarYear,i);
Дни:=Дни+HiWord(tmp);
Дни:=Дни+LoWord(tmp);
конец;
Результат:=Дни;
конец;
процедураFormatLunarYear (iYear: Word; varpBuffer: строка);
вар
szText1, szText2, szText3: строка;
начинать
szText1:='A, B, C, D, У, Цзи, Гэн, Синь Жэньгуй';
szText2:='Zichou Yinmaochen Siwu не подал заявку на участие в Youxuhai';
szText3:='Крыса, бык, тигр, дракон, змея, лошадь, овца, обезьяна, курица, собака и свинья';
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+'год';
конец;
functionFormatLunarYear (iYear: Word): строка;
вар
pBuffer: строка;
начинать
ФорматЛунарГод(iГод,pBuffer);
Результат:=pBuffer;
конец;
процедураFormatMonth(iMonth:Word;varpBuffer:string;bLunar:Boolean);
вар
сзТекст: строка;
начинать
если(notbLunar)и(iMonth=1),то
начинать
pBuffer:='Январь';
Выход;
конец;
szText:='положительные два, три, четыре, пять, шесть, семь, восемь, девяносто';
еслииМесяц<=10тогда
начинать
pBuffer:='';
pBuffer:=pBuffer+Copy(szText,(iMonth-1)*2+1,2);
pBuffer:=pBuffer+'месяц';
Выход;
конец;
ifiMonth=11тогда
pBuffer:='Одиннадцать'
еще
pBuffer:='двенадцать';
pBuffer:=pBuffer+'месяц';
конец;
functionFormatMonth(iMonth:Word;bLunar:Boolean):строка;
вар
pBuffer: строка;
начинать
FormatMonth(iMonth,pBuffer,bLunar);
Результат:=pBuffer;
конец;
процедураFormatLunarDay (iDay: Word; varpBuffer: строка);
вар
szText1, szText2: строка;
начинать
szText1:='Двадцать третий день лунного месяца';
szText2:='Один, два, три, четыре, пять, шесть, семь, восемь, девяносто';
если (iDay<>20) и (iDay<>30), то
начинать
pBuffer:=Copy(szText1,((iDay-1)div10)*2+1,2);
pBuffer:=pBuffer+Copy(szText2,((iDay-1)mod10)*2+1,2);
конец
еще
начинать
pBuffer:=Copy(szText1,(iDaydiv10)*2+1,2);
pBuffer:=pBuffer+'十';
конец;
конец;
functionFormatLunarDay (iDay: Word): строка;
вар
pBuffer: строка;
начинать
ФорматLunarDay(iDay,pBuffer);
Результат:=pBuffer;
конец;
functionCalcDateDiff(iEndYear,iEndMonth,iEndDay:Word;iStartYear:Word;iStartMonth:Word;iStartDay:Word):Longword;
начинать
Результат:=Trunc(EncodeDate(iEndYear,iEndMonth,iEndDay)-EncodeDate(iStartYear,iStartMonth,iStartDay));
конец;
functionCalcDateDiff(EndDate,StartDate:TDateTime):Longword;
начинать
Результат:=Trunc(EndDate-StartDate);
конец;
процедураl_CalcLunarDate(variYear,iMonth,iDay:Word;iSpanDays:Longword);
вар
tmp: длинное слово;
начинать
//19 февраля 1901 года по григорианскому календарю — первый день первого лунного месяца 1901 года.
//В григорианском календаре 49 дней с 1 января по 19 февраля 1901 года.
ifiSpanDays<49тогда
начинать
iYear:=START_YEAR-1;
ifiSpanDays<19тогда
начинать
яМесяц:=11;
iDay:=11+Word(iSpanDays);
конец
еще
начинать
яМесяц:=12;
iDay:=Word(iSpanDays)-18;
конец;
Выход;
конец;
//Следующие расчеты начинаются с первого дня первого лунного месяца 1901 года.
iSpanDays:=iSpanDays-49;
iYear:=START_YEAR;
iМесяц:=1;
iДень:=1;
//вычисляем год
tmp:=LunarYearDays(iYear);
whileiSpanDays>=tmpdo
начинать
iSpanDays:=iSpanDays-tmp;
Inc(iГод);
tmp:=LunarYearDays(iYear);
конец;
//Рассчитываем месяц
tmp:=LoWord(LunarMonthDays(iYear,iMonth));
whileiSpanDays>=tmpdo
начинать
iSpanDays:=iSpanDays-tmp;
ifiMonth=GetLeapMonth(iYear), затем
начинать
tmp:=HiWord(LunarMonthDays(iYear,iMonth));
ifiSpanDays<tmpthenBreak;
iSpanDays:=iSpanDays-tmp;
конец;
Inc(iMonth);
tmp:=LoWord(LunarMonthDays(iYear,iMonth));
конец;
//Рассчитываем день
iDay:=iDay+Word(iSpanDays);
конец;
functionl_GetLunarHolDay(iYear,iMonth,iDay:Word):Word;
вар
Флаг: Байт;
День: Слово;
начинать
Флаг:=gLunarHolDay[(iYear-START_YEAR)*12+iMonth-1];
ifiDay<15тогда
День:=15-((Flagshr4)and$0f)
еще
День:=(Flagand$0f)+15;
ifiDay=День тогда
ifiDay>15тогда
Результат:=(iMonth-1)*2+2
еще
Результат:=(iMonth-1)*2+1
еще
Результат:=0;
конец;
functionGetLunarHolDay(InDate:TDateTime):строка;
вар
я, iYear, iMonth, iDay: Word;
начинать
DecodeDate(InDate,iYear,iMonth,iDay);
я:=l_GetLunarHolDay(iYear,iMonth,iDay);
случай
1:Результат:='Сяохань';
2:Result:='Большая простуда';
3:Result:='Начало весны';
4:Результат:='Дождь';
5:Результат:='Цзинчжэ';
6:Result:='Весеннее равноденствие';
7:Результат:='Цинмин';
8:Результат:='Гу Юй';
9:Result:='Начало лета';
10:Результат:='Сяомань';
11:Результат:='awn';
12:Result:='Летнее солнцестояние';
13:Result:='Небольшая жара';
14:Result:='Сильная жара';
15:Result:='Начало осени';
16:Result:='Конец забега';
17:Result:='Белая роса';
18:Result:='Осеннее равноденствие';
19:Result:='Холодная роса';
20:Result:='Мороз';
21:Result:='Начало зимы';
22:Результат:='Сяосюэ';
23:Result:='Сильный снегопад';
24:Result:='Зимнее солнцестояние';
еще
l_CalcLunarDate(iYear,iMonth,iDay,CalcDateDiff(InDate,EncodeDate(START_YEAR,1,1)));
Результат:=trim(FormatMonth(iMonth)+FormatLunarDay(iDay));
конец;
конец;
functionGetLunarHolDay(iYear,iMonth,iDay:Word):string;
начинать
Результат: = GetLunarHolDay(EncodeDate(iYear,iMonth,iDay));
конец;
конец.