Excel - VBA

천문연구원 API를 이용한 음력 확인

EGTools 2023. 1. 19. 00:39
728x90

ToLunar와 ToSolar 함수를 EGTools에 추가하면서

실제 변환이 정확한지 확인하는 것을 천문연구원에서 제공하는 API를 이용해서 확인을 했었는데,

여기에 사용한 코드입니다.

 

천문연구원에서는 양력기준으로 기원전 59년 2월 13일부터 2050년 12월 31일까지의 양력/음력 날짜를 제공합니다.

양력 달력을 이용하기 위한 API를 주소는 https://astro.kasi.re.kr/life/solc? 이며 yyyy, mm, dd 3가지를 양력으로 입력합니다.

 

조회 결과는 아래와 같은 형태로 반환됩니다.

{"SOLC_WEEK":"토","SOLC_DD":"01","SOLC_LEAP_YYYY":"평","JULIAN_DD":"18","JULIAN_YYYY":"2017","LUNC_YYYY":"2017","LUNC_AGE":7.4,"LUNC_EN_DD":"29","LUNC_WLGN":"","SOLC_MM":"07","JULIAN_LeapYear":"평","SOLC_JD":"2457936","LUNC_ILJIN":"기축(己丑)","LUNC_MM":"05","LUNC_DD":"08","LUNC_PRCN":"정유(丁酉)","JULIAN_MM":"06","SOLC_YYYY":"2017","LUNC_LEAP_MM":"윤"}

 

여기서 필드명으로 값을 추출하는 getValue() 함수를 사용합니다.

 

함수의 반환결과가 String인 이유는

음력날짜중에 양력에 없는 날짜 (음력 2월 30일)가 있고 윤달이 있기 때문입니다.

 

EGTools의 ToLunar 함수는 인터넷 연결이 없는 상태에서도 결과 값을 내야 하기 때문에 

아래 코드를 사용하지 않고 별도로 기준일자로부터 날짜를 세는 방법을 적용하였습니다.

Function getLunarDate(argDate As Date) As String

    Dim msXML As Object: Set msXML = CreateObject("MSXML2.XMLHTTP.6.0")
    Dim result As String

    With msXML
        '// <음력>기원전59년 1월 1일부터 <음력>2050년11월18일까지
        '// <양력>기원전59년 2월13일부터 <양력>2050년12월31일까지
        .Open "GET", "https://astro.kasi.re.kr/life/solc?yyyy=" & Year(argDate) & "&mm=" & Format(Month(argDate), "00") & "&dd=" & Format(Day(argDate), "00")
        .send
        
        Sleep 10
        Do While .Status <> 200
            Sleep 10
        Loop
        
        result = .ResponseText
        '// {"SOLC_WEEK":"토","SOLC_DD":"01","SOLC_LEAP_YYYY":"평","JULIAN_DD":"18","JULIAN_YYYY":"2017","LUNC_YYYY":"2017","LUNC_AGE":7.4,"LUNC_EN_DD":"29","LUNC_WLGN":"","SOLC_MM":"07","JULIAN_LeapYear":"평","SOLC_JD":"2457936","LUNC_ILJIN":"기축(己丑)","LUNC_MM":"05","LUNC_DD":"08","LUNC_PRCN":"정유(丁酉)","JULIAN_MM":"06","SOLC_YYYY":"2017","LUNC_LEAP_MM":"윤"}
        
        getLunarDate = getLunarDate & getValue(result, "LUNC_YYYY") & "-" _
                        & getLunarDate & getValue(result, "LUNC_MM") & "-" _
                        & getLunarDate & getValue(result, "LUNC_DD") _
                        & Replace(getLunarDate & "(" & Replace(getValue(result, "LUNC_LEAP_MM"), "}", vbNullString) & ")", "(평)", vbNullString)
    End With
    
End Function

Function getValue(argResult As String, fieldName As String)
    Dim vResult As Variant, sDelimiter As String
    
    sDelimiter = """" & fieldName & """:"
    
    vResult = Split(argResult, sDelimiter)
    vResult = Split(vResult(1), ",")(0)
    vResult = Replace(vResult, """", vbNullString)
    getValue = vResult

End Function
728x90