제가 델파이 헬펑에서 음력<=>양력 로직을 받아서 작업을 하고 있어요..
근데 아무리 봐도 모르겠어요...
도대체.................
음력 생일을 양력으로 바꿔서 조회를 해야 하는데...
답변으로 올려주신 로직이 전혀 이해가 되지 않아요..
기존 양력생일을 저장하는 곳은 어딘지...
시간은 얼마 없는데 맘만 급해서 더 안되요...
혹 다른 쉬운 방법이나,, 이 로직으로 성공하신분 조언 좀 부탁드립니다...
델파이 헬퍼의 게시 자료 번호...1번이예요..
> 제가 델파이 헬펑에서 음력<=>양력 로직을 받아서 작업을 하고 있어요..
> 근데 아무리 봐도 모르겠어요...
> 도대체.................
> 음력 생일을 양력으로 바꿔서 조회를 해야 하는데...
> 답변으로 올려주신 로직이 전혀 이해가 되지 않아요..
> 기존 양력생일을 저장하는 곳은 어딘지...
> 시간은 얼마 없는데 맘만 급해서 더 안되요...
> 혹 다른 쉬운 방법이나,, 이 로직으로 성공하신분 조언 좀 부탁드립니다...
> 델파이 헬퍼의 게시 자료 번호...1번이예요..
>
조진희님 안녕하세요?
아래 내용은 전철호님이 작성하신 모듈입니다.
보시고 참조하세요.
=======================================================
양력을 음력으로 바꾸는 Procedure입니다.
양력이 1943년부터 2043년까지만 됩니다.
아마 이정도면 이세상에 내가 존재할때까지는 충분하지
않을까?..
aYear,aMonth,aDay는 입력 파리미터
lYear,lMonth,lDay는 출력 파리미터
예를 들어서
lunar(1999,2,16,ly,lm,ld)라고 입력하면
음력일자인 ly:1999,lm:1,ld:1이 입력됩니다.
procedure lunar(const aYear,aMonth,aDay : integer; var lYear,lMonth,lDay : real);
var
i2, i3, i4, j2 : integer;
a, lm : real;
const
lum : array[0..1236] of real =
(1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,1,0.5,1,0,1,0,0,1,0,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0,1,0,0,1,0,0,0,1.5,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,
0,0,1,0,1,0,1,1.5,0,1,0,1,0,0,1,0,0,1,0,1,1,0,1,0,1,
0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0.5,0,1,0,1,0,1,0,1,0,1,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0,1,0,0,1,0,0,0,1,1,0.5,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,
//*57년~62년*
0,1,0,1,0,1,1,0,1.5,0,1,0,0,1,0,0,1,0,1,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1.5,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,0,1,0,0,1,
0,1,0,1,1.5,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,1,0,0,0,1,0,0,1.5,0,1,1,0,1,1,0,0,1,0,0,1,0,0,1,1,0,1,0,1,0,1,0,0,1,0,1,0,1.5,0,1,0,1,0,
1,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,0,1,0,1,0,1,1,0,1.5,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,1,0,0,0,1,0,0,1,0,1.5,1,0,1,1,0,0,1,0,
0,0,1,0,1,1,0,1,1,0,1,0,0,0,1,0,1,0,1,0,1.5,0,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,0.5,1,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0,0,
1,0,1,1,0,1,1,0,0,1,0,0,0,1,0,1,1.5,0,1,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0,1.5,0,0,1,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,1,1,
0,1,0,0,1,0,1.5,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,1.5,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0,1,0,0,
1,0,0,1.5,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1.5,0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,1,1.5,0,0,1,0,0,0,1,
//*99년~04년*
0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0,1,0,0,1,0,0,0,1,1.5,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,1,0,1,0,1.5,0,0,1,0,1,0,1,0,1,0,
1,0,1,0,1,0,0,1,0,0,1,0,1,1,0,1,0,1,0,1.5,0,0,1,0,0,1,1,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1.5,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,
0,1,0,0,1,0,1,1,0,1,0,1,0,1,0,0.5,0,1,0,1,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0.5,1,0,1,0,1,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0,1,0,0,1,0,0,
0,1,1,0,1,1.5,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,0,0,1.5,0,1,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,
1,0,1.5,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,0,1,0,0,1,0,1,0,1,1,0,1.5,0,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,0,1,1,0,0,0,1,0,0,1,0,1.5,1,0,1,1,0,0,1,
0,0,1,0,0,1,1,0,1,1,0,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1.5,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,0,1,0,0,1,0,1,0,1,1,0,1,0,1.5,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,0,1,
//*35년~40년*
0,1,0,1,1,0,1,1,0,0,1,0,0,0,1,0,1,1,0.5,1,1,0,1,0,0,0,0,1,0,1,1,0,1,1,0,1,0,0,0,1,0,1,0,1,0,1,1,0,1,0,0,1,0,0,1.5,0,1,0,1,0,1,1,0,1,0,0,1,0,0,1,0,1,0,1,
0,1,1,0,1,0,0,1,0,0,1,0,1,0,1.5,1,0,1,0,1,0,0,0,1,0);
begin
lYear := 0;
lMonth := 0;
lDay := 0;
if (aYear < 1943) or (aYear > 2043) then
System.Exit;
i3 := 0;
lm := 0;
a := 0;
i2 := (aYear - 1943) div 4;
j2 := i2 * 1461;
i2 := aYear - i2 * 4;
if (i2 = 1945) then
j2 := j2 + 731
else
if (i2 = 1944) then
begin
if ((aMonth >= 3) or ((aMonth = 2) and (aDay = 29))) then
j2 := j2 + 366
else
j2 := j2 + 365;
end
else
if (i2 = 1946) then
j2 := j2 + 1096;
case aMonth of
1 : j2 := j2 - (31 - aDay + 4);
2 : j2 := j2 + (aDay - 4);
3 : j2 := j2 + (aDay + 24);
4 : j2 := j2 + (aDay + 55);
5 : j2 := j2 + (aDay + 85);
6 : j2 := j2 + (aDay + 116);
7 : j2 := j2 + (aDay + 146);
8 : j2 := j2 + (aDay + 177);
9 : j2 := j2 + (aDay + 208);
10: j2 := j2 + (aDay + 238);
11: j2 := j2 + (aDay + 269);
12: j2 := j2 + (aDay + 299);
end;
i2 := 0;
while i2 < 1237 do
begin
a := 30 - lum[i2];
if (a <> 29) and (a <> 30) then
a := a + 0.5;
lm := lm + a;
if (lm >= j2) then
break;
Inc(i2);
end;
lm := a - (lm - j2);
Inc(i2);
i4 := 1;
while i4 <= i2 do
begin
if (i4 = i2) then
begin
lYear := 1943 + ((i4 - i3) div 12);
if (lum[i4-1] = 0.5) or (lum[i4-1] = 1.5) then
begin
lMonth := (i4 - (i3 + 1)) mod 12;
Dec(i3);
end
else
lMonth := (i4 - i3) mod 12;
if (lMonth = 0) then
lMonth := 12;
end;
if (lum[i4-1] = 0.5) or (lum[i4-1] = 1.5) then
begin
Inc(i3);
if (i4 = i2) then
lMonth := lMonth + 0.5;
end;
Inc(i4);
end;
lDay := lm;
end;