Last active
March 12, 2023 01:37
-
-
Save twkang/4608424 to your computer and use it in GitHub Desktop.
JavaScript: Google spreadsheet scripts to convert dates between Korean lunar calendar and solar calendar
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 음력일자를 받아서 양력일자를 리턴하는 함수 (한국천문연구원 사이트를 이용) | |
* 음력 10월 3일의 2013년 양력일자를 알고 싶은 경우 lun2sol(2013, 10, 3, 1) 으로 호출 | |
* 응답으로는 '2013/11/05' 와 같이 스트링을 리턴. | |
* yoon (윤달구분) : 1 - 평달, 2 - 윤달 | |
*/ | |
function lun2sol(yyyy, mm, dd, yoon) { | |
yyyy = parseInt(yyyy, 10); mm = parseInt(mm, 10); dd = parseInt(dd, 10); | |
if ((yyyy <= 1391) || (yyyy >= 2050)) { | |
return "ERROR"; | |
} | |
if ((mm < 1) || (mm > 12)) { | |
return "ERROR"; | |
} | |
if ((dd < 1) || (dd > 31)) { | |
return "ERROR"; | |
} | |
/* 이미 조회했던 일자이면 ScriptProperties 에서 읽어 온다. -- 네트웍을 통한 조회는 한번만 하도록 */ | |
var prop = ScriptProperties.getProperty("lun2sol/" + yyyy + "/" + mm + "/" + dd + "/" + yoon); | |
if (prop != null) { | |
Logger.log("Read from db: " + prop); | |
return prop; | |
} | |
var payload = { | |
"lun_year": String(yyyy), | |
"lun_month": String(mm), | |
"lun_day": String(dd), | |
"yoon": String(yoon) | |
}; | |
var params = { | |
"method": "post", | |
"payload": payload | |
}; | |
var result = UrlFetchApp.fetch("http://astro.kasi.re.kr/Life/Knowledge/solar2lunar/convert_daily_l2s.php", params); | |
var htmlstr = result.getContentText(); | |
//Logger.log(htmlstr); | |
var pos = htmlstr.indexOf("td width=500"); //-- 천문연구원 사이트 변경되면 수정 필요 | |
if (pos >= 0) { | |
pos = pos + 13; | |
var checkChar = htmlstr.substr(pos, 1); | |
if ((checkChar >= "0") && (checkChar <= "9")) { | |
; | |
} | |
else { | |
return "ERROR"; | |
} | |
var new_prop = htmlstr.substr(pos, 4) + "/" + htmlstr.substr(pos + 7, 2) + "/" + htmlstr.substr(pos + 12, 2) | |
ScriptProperties.setProperty("lun2sol/" + yyyy + "/" + mm + "/" + dd + "/" + yoon, new_prop); | |
return new_prop; | |
} | |
return "ERROR"; | |
} | |
/** | |
* 양력일자를 받아서 음력일자를 리턴하는 함수 (한국천문연구원 사이트를 이용) | |
* 양력 2013년 1월 26일의 음력일자를 알고 싶은 경우 sol2lun(2013, 1, 26) 으로 호출 | |
* 응답으로는 '2012/12/15 평달' 과 같이 스트링을 리턴. | |
*/ | |
function sol2lun(yyyy, mm, dd) { | |
yyyy = parseInt(yyyy, 10); mm = parseInt(mm, 10); dd = parseInt(dd, 10); | |
if ((yyyy <= 1391) || (yyyy >= 2050)) { | |
return "ERROR"; | |
} | |
if ((mm < 1) || (mm > 12)) { | |
return "ERROR"; | |
} | |
if ((dd < 1) || (dd > 31)) { | |
return "ERROR"; | |
} | |
/* 이미 조회했던 일자이면 ScriptProperties 에서 읽어 온다. -- 네트웍을 통한 조회는 한번만 하도록 */ | |
var prop = ScriptProperties.getProperty("sol2lun/" + yyyy + "/" + mm + "/" + dd); | |
if (prop != null) { | |
Logger.log("Read from db: " + prop); | |
return prop; | |
} | |
var payload = { | |
"sol_year": String(yyyy), | |
"sol_month": String(mm), | |
"sol_day": String(dd), | |
}; | |
var params = { | |
"method": "post", | |
"payload": payload | |
}; | |
var result = UrlFetchApp.fetch("http://astro.kasi.re.kr/Life/Knowledge/solar2lunar/convert_daily_s2l.php", params); | |
var htmlstr = result.getContentText(); | |
var yoonstr; | |
var pos = htmlstr.indexOf("td width=500"); //-- 천문연구원 사이트 변경되면 수정 필요 | |
if (pos >= 0) { | |
pos = pos + 13; | |
var checkChar = htmlstr.substr(pos, 1); | |
if ((checkChar >= "0") && (checkChar <= "9")) { | |
; | |
} | |
else { | |
return "ERROR"; | |
} | |
if (htmlstr.indexOf("br>(") == -1) { //-- 천문연구원 사이트 변경되면 수정 필요 | |
yoonstr = "평달"; | |
} | |
else { | |
yoonstr = "윤달"; | |
} | |
var new_prop = htmlstr.substr(pos, 4) + "/" + htmlstr.substr(pos + 7, 2) + "/" + htmlstr.substr(pos + 12, 2) + " " + yoonstr; | |
ScriptProperties.setProperty("sol2lun/" + yyyy + "/" + mm + "/" + dd, new_prop); | |
return new_prop; | |
} | |
return "ERROR"; | |
} | |
function test_lun2sol() { | |
//Logger.log(lun2sol("2013", "10", "3", 1)); | |
Logger.log(lun2sol(2013, 1, 4, 1)); | |
} | |
function test_sol2lun() { | |
Logger.log(sol2lun("2013", "1", "26")); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment