Skip to content

Instantly share code, notes, and snippets.

@twkang
Last active March 12, 2023 01:37
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save twkang/4608424 to your computer and use it in GitHub Desktop.
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
/**
* 음력일자를 받아서 양력일자를 리턴하는 함수 (한국천문연구원 사이트를 이용)
* 음력 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