Dim sYEAR, sMONTH, sDAY ' 양력일자를 저장할 변수
Dim lYEAR, lMONTH, lDAY ' 음력일자를 저장할 변수
Dim YoonYN ' 윤년 여부를 저장하는 변수 1=윤년, 0=평년
Function siYoon(yy) ' 윤년인지를 판단하는 함수
if yy mod 4 <> 0 then
YoonYN = 0
elseif yy mod 100 <> 0 then
YoonYN = 1
elseif yy mod 400 <> 0 then
YoonYN = 0
else
YoonYN = 1
end if
End Function
Function Sol2Lun(y, m, d)
dim dt() ' 매년의 음력일수를 저장할 배열 변수
dim td ' 음력일을 계산하기 위해 양력일과의 차이를 저장할 변수
dim td1 ' 1840년까지의 날수
dim td2 ' 현재까지의 날수
dim sy, sm, sd ' 전해온 양력 인자값을 저장할 년, 월, 일 임시변수
dim mm ' 임시변수
dim ly, lm, ld ' 계산된 음력 년, 월, 일을 저장할 변수
dim yoon ' 현재월이 윤달임을 표시
td1 = 672069 ' 672069 = 1840 * 365 + 1840/4 - 1840/100 + 1840/400 + 23 //1840년까지 날수
sy = y
sm = m
sd = d
siYoon(sy) ' 윤달여부를 체크
if YoonYn = 1 then
amd(1) = 29
else
amd(1) = 28
end if
' 전월까지의 날수를 더함
for i = 0 to sm - 2
td2 = td2 + int(amd(i))
next
' 현재일까지의 날수를 더함
td2 = td2 + sd
' 양력현재일과 음력 1840년까지의 날수의 차이
td = td2 - td1 + 1
' 1841년부터 음력날수를 계산
redim dt(sy-1841)
for i = 0 to sy - 1841
dt(i) = 0
for j = 0 to 11
select case int(akk(i*12 + j))
case 1 : mm = 29
case 2 : mm = 30
case 3 : mm = 58 ' 29 + 29
case 4 : mm = 59 ' 29 + 30
case 5 : mm = 59 ' 30 + 29
case 6 : mm = 60 ' 30 + 30
end select
dt(i) = dt(i) + mm
next
next
' 1840년 이후의 년도를 계산 - 현재까지의 일수에서 위에서 계산된 1841년부터의 매년 음력일수를 빼가면수 년도를 계산
ly = 0
do while(td > dt(ly))
td = td - dt(ly)
ly = ly + 1
loop
lm = 0
yoon = "" ' 현재월이 윤달임을 표시할 변수 - 필요하면 사용하면 됨
do while(1)
if int(akk(ly*12 + lm)) <= 2 then
mm = int(akk(ly*12 + lm)) + 28
if td > mm then
td = td - mm
lm = lm + 1
else
exit do
end if
else ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
select case int(akk(ly*12 + lm))
case 3 :
m1 = 29
m2 = 29
case 4 :
m1 = 29
m2 = 30
case 5 :
m1 = 30
m2 = 29
case 6 :
m1 = 30
m2 = 30
end select
if td > m1 then
td = td - m1
if td > m2 then
td = td - m2
lm = lm + 1
else
yoon = "윤달"
end if
else
exit do
end if
end if
loop
ly = ly + 1841
lm = lm + 1
ld = td
lYEAR = ly
lMONTH = lm
lDAY = ld
End Function
Function Lun2Sol(y, m, d)
dim ly, lm, ld ' 전해온 음력 인자값을 저장할 년, 월, 일 임시변수
dim sy, sm, sd ' 계산된 양력 년, 월, 일을 저장할 변수
dim y1, m1, i, j, y2, y3 ' 임시변수
ly = y
lm = m
ld = d
y1 = ly - 1841
m1 = lm - 1
leap = 0
if int(akk(y1*12 + m1)) > 2 then
siYoon(ly)
leap = YoonYN
end if
if leap = 1 then
select case int(akk(y1*12 + m1))
case 3 : mm = 29
case 4 : mm = 30
case 5 : mm = 29
case 6 : mm = 30
end select
else
select case int(akk(y1*12 + m1))
case 1 : mm = 29
case 2 : mm = 30
case 3 : mm = 29
case 4 : mm = 29
case 5 : mm = 30
case 6 : mm = 30
end select
end if
td = 0
for i = 0 to y1 - 1
for j = 0 to 11
select case int(akk(i*12 + j))
case 1 : td = td + 29
case 2 : td = td + 30
case 3 : td = td + 58
case 4 : td = td + 59
case 5 : td = td + 59
case 6 : td = td + 60
end select
next
next
for j = 0 to m1 - 1
select case int(akk(y1*12 + j))
case 1 : td = td + 29
case 2 : td = td + 30
case 3 : td = td + 58
case 4 : td = td + 59
case 5 : td = td + 59
case 6 : td = td + 60
end select
next
if leap = 1 then
select case int(akk(y1*12 + m1))
case 3 : mm = 29
case 4 : mm = 29
case 5 : mm = 30
case 6 : mm = 30
end select
end if