// Для алгоритма праздника, пожалуйста, см. «Сравнение лунного календаря и западного календаря, вечного календаря»
единица Cnyear;
интерфейс
использует Sysutils;
тип tcndate = cardinal;
Функция decodegregtocndate (dtgreger: tdatetime): tcndate;
function getGgreDateFromcn (cnyear, cnmonth, cnday: слово; bleap: boolean = false): tdatetime;
функция gregdatetocnstr (dtgreg: tdatetime): string;
функция iscnleap (cndate: tcndate): boolean;
Выполнение
Const Cstdateorg: Integer = 32900;
const cstcnyearorg = 1990;
constcntable: array [cstcnyearorg..cstcnyearorg + 60] of word = (// unsigned 16-bit
24402, 3730, 3366, 13614, 2647, 35542, 858, 1749, // 1997
23401, 1865, 1683, 19099, 1323, 2651, 10926, 1386, // 2005
32213, 2980, 2889, 23891, 2709, 1325, 17757, 2741, // 2013
39850, 1490, 3493, 61098, 3402, 3221, 19102, 1366, // 2021
2773, 10970, 1746, 26469, 1829, 1611, 22103, 3243, // 2029
1370, 13678, 2902, 48978, 2898, 2853, 60715, 2635, // 2037
1195, 21179, 1453, 2922, 11690, 3474, 32421, 3365, // 2045
2645, 55901, 1206, 1461, 14038);
// Метод создания таблиц:
// 0101 111101010010 Высокие четыре цифры - это положение перейного месяца, последние 12 цифр представляют большой и большой месяц, большой месяц составляет 30 дней, а небольшой месяц - 29 дней,
// Перечех месяц обычно считается небольшим месяцем, но есть три специальных случая 2017/06, 2036/06, 2047/05
// Для особых случаев наиболее высокое представление о позиции в течение месяца на четырехзначное высокое перспективы установлено на 1. Специальная обработка использует wleapnormal переменную
// // 2017/06 28330-> 61098 2036/06 27947-> 60715 2047/05 23133-> 55901
// Если вы хотите использовать сборку, вот сообщение: Лунный календарь не будет отставать за григорианским календарем в течение 2 месяцев.
// преобразовать григорианский календарь в лунный календарь
// Возврат: 12-значный год + 4-значный месяц + 5-значная дата
Функция decodegregtocndate (dtgreger: tdatetime): tcndate;
вар
IdayLeave: целое число;
Wyear, Wmonth, Wday: Word;
я, J: целое число;
WBIGSMALLDIST, WLEAP, WCOUNT, WLEAPSHIFT: Word;
Этикетка ОК;
Начинать
Результат: = 0;
IdayLeave: = trunc (dtgreg) - cstdateorg;
Декоседед (incmonth (dtgreg, -1), Wyear, Wmonth, Wday);
if (idayLeave <0) или (IdayLeave> 22295), затем выйти;
// повышение excection.create («В настоящее время считается только 1990-01-27 после ');
// повышение excection.create ('В настоящее время его можно подсчитать только так, как до 2051-02-11');
для i: = low (cstcntable) до высокого (cstcntable) do begin
wbigsmalldist: = cstcntable [i];
WLEAP: = WBIGSMALLDIST SHR 12;
Если WLEAP> 12, тогда начните
WLEAP: = WLEAP и 7;
wleapshift: = 1;
конец еще
wleapshift: = 0;
для j: = от 1 до 12
wcount: = (wbigsmalldist и 1) + 29;
Если j = wleap, то wcount: = wcount - wleapshift;
Если IdayLeave <wcount, то начните
Результаты: = (i Shl 9) + (J Shl 5) + IdayLeave + 1;
Выход;
конец;
IdayLeave: = IdayLeave - Wcount;
Если j = wleap, то начните
WCOUNT: = 29 + WLEAPSHIFT;
Если IdayLeave <wcount, то начните
Результаты: = (i Shl 9) + (J Shl 5) + IdayLeave + 1 + (1 Shl 21);
Выход;
конец;
IdayLeave: = IdayLeave - Wcount;
конец;
WBIGSMALLDIST: = WBIGSMALLDIST SHR 1;
конец;
конец;
// возвращаемое значение:
// 1 цифровой логотип в месяц + 12 -значный год + 4 -значный месяц + 5 цифр (всего 22 цифры)
конец;
функция iscnleap (cndate: tcndate): boolean;
Начинать
Результат: = (CNDATE и 200000 долл. США) <> 0;
конец;
function getGgreDateFromcn (cnyear, cnmonth, cnday: слово; bleap: boolean = false): tdatetime;
вар
я, J: целое число;
Daycount: целое число;
WBIGSMALLDIST, WLEAP, WLEAPSHIFT: Word;
Начинать
// 0101 010010111111 Высокие четыре цифры - это положение перейного месяца, последние 12 цифр представляют большой и большой месяц, большой месяц составляет 30 дней, а небольшой месяц - 29 дней,
Daycount: = 0;
if (cnyear <1990) или (cnyear> 2050), затем начните
Результаты: = 0;
Выход;
конец;
для i: = cstcnyearorg to cnyear-1 do begin
wbigsmalldist: = cstcntable [i];
if (wbigsmalldist и $ f000) <> 0, тогда DayCount: = DayCount + 29;
Daycount: = Daycount + 12 * 29;
для j: = от 1 до 12
DayCount: = DayCount + WBIGSMALLDIST и 1;
WBIGSMALLDIST: = WBIGSMALLDIST SHR 1;
конец;
конец;
wbigsmalldist: = cstcntable [cnyear];
WLEAP: = WBIGSMALLDIST SHR 12;
Если WLEAP> 12, тогда начните
WLEAP: = WLEAP и 7;
Wleapshift: = 1;
конец еще
wleapshift: = 0;
для j: = 1 до cnmonth-1 начинается
DayCount: = DayCount + (WBIGSMALLDIST и 1) + 29;
Если j = wleap, то DayCount: = DayCount + 29;
WBIGSMALLDIST: = WBIGSMALLDIST SHR 1;
конец;
Если BLEAP и (CNMONTH = WLEAP), то // это височный месяц?
Daycount: = Daycount + 30 - Wleapshift;
Результат: = CSTDATEORG + DayCount + Cnday - 1;
конец;
// Показать даты в лунные струны.
функция gregdatetocnstr (dtgreg: tdatetime): string;
const hznumber: array [0..10] of string = ('Zero', 'one', 'two', 'three', 'four', 'five', 'six', 'семь', 'восемь', 'девяносто');
Функция ConvertyMD (число: Word; YMD: Word): String;
вар
WTMP: слово;
Начинать
Результат: = '';
Если ymd = 1, то начните // год
В то время как номер> 0 начинается
Результат: = hznumber [номер мод 10] + результат;
Номер: = номер div 10;
конец;
Выход;
конец;
Если номер <= 10, то может быть использовано только 1 цифра
Если ymd = 2, то // месяц
Результат: = hznumber [число]
иначе // день
Результат: = 'First' + hznumber [номер];
Выход;
конец;
WTMP: = номер мод 10; // Одиночные биты
Если wtmp <> 0, то результат: = hznumber [wtmp];
wtmp: = number div 10;
результат: = 'ten'+результат;
Если wtmp> 1, то результат: = hznumber [wtmp] + result;
конец;
вар
Cnyear, Cnmonth, Cnday: Word;
Cndate: Tcndate;
strleap: string;
Начинать
cndate: = decodegregregtocndate (dtgreg);
Если cndate = 0, тогда начните
Результат: = 'Вход из границ';
Выход;
конец;
cnday: = cndate и $ 1F;
Cnmonth: = (Cndate SHR 5) и $ F;
cnyear: = (cndate shr 9) и $ fff;
// 22 -я позиция теста составляет 1, что означает прыжковой месяц
Если iscnleap (cndate), то strLeap: = '(Leap)' else strLeap: = '';
Результат: = 'Лунный календарь' + convertymd (cnyear, 1) + 'year' + convertymd (cnmonth, 2) + 'месяц'
+ strleap + convertymd (cnday, 3);
конец;
конец.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////// //////////////
использует cnyear;
Процедура tform1.button1click (отправитель: tobject);
Начинать
edit1.text: = gregdatetocnstr (datetimepicker1.date);
конец;