개발을 전업으로 한지는 너무도 오랜 시간이 지났지만 코딩 감각도 유지하고 VSCode와 Git, Github 등도 사용해볼 겸 이따금씩 코딩을 하곤 한다. 요즘엔 PHP로 웹에서 사용할 수 있는 각종 계산기를 서비스하는 웹사이트를 취미삼아 Chat-GPT의 도움을 받아 만들고 있다.
양력과 음력 변환 계산기 (Solar and Lunar calendar)
여러계산기 기능을 코딩하는 중에 양력과 음력을 변환해주는 계산기도 코딩하고 있다. 그런데 이 양력과 음력을 변환하는 코드를 직접 작성 계산해 작성하려다 보니 너무도 복잡하고 이해조차 잘 되지 않는다. 결정적으로 난 숫자를 싫어한다.
그래서 관련 PHP 라이브러리를 찾아보니 아니나 다를까 사용할 만한 라이브러리는 이미 만들어져 있었다. 다만 PHP에 기본적으로 설치되어 있지 않기에 웹서버에 PEAR를 설치해 한국천문연구원의 데이터를 기반으로 작성된 음/양력 변환 클래스를 내려받아 사용하면 된다. KASI-Lunar라는 aero님(블로그)이 만든 Perl 모듈(Date-Korean-0.0.2)을 JoungKyun Kim님이 PHP로 포팅하여 Github 통해 공개하고 있다.
pear 설치
먼저 pear를 설치해야한다. Ubuntu 리눅스 또는 Rocky 리눅스에서 pear를 설치하기 위해 아래 명령으로 go-pear.phar 파일을 다운로드 받는다.
wget https://pear.php.net/go-pear.phar
다운로드 받은 go-pear.phar 파일을 설치하기 위해 php 명령으로 다음과 같이 실행한다. 단, root 계정에서 작업해야 한다.
php go-pear.phar
go-pear.phar 을 설치하면 /usr/bin 아래에 pear 이라는 명령어가 설치되는데 경우에 따라서는 파일명이 pear이 아닌 pear_old로 설치되는 경우가 있는 듯 하다. Rocky 리눅스에서 그런 증상이 나타났다. 이런 경우 그냥 pear로 이름을 mv 해주면 문제 없이 동작했다.
그리고 mysqli 관련 에러가 발생하는 경우도 있는데 warning 이라서 그냥 무시하고 작업을 진행했다.
oops/Lunar 설치
pear가 설치되었다면 JoungKyun Kim님이 양력과 음력 변환 라이브러리를 배포하고 있는 pear.oops.org 채널을 등록해 준다.
pear channel-discover pear.oops.org
채널이 오류없이 등록되었으면 oops/Lunar 라이브러리를 설치한다.
pear install oops/Lunar
설치과정에서 docs, man 등등 경로를 설정하게 되어있는데 적당한 경로를 찾아 설정해준다. man 페이지나 관련 문서들이 설치되는 경로인데 리눅스의 기본 man 경로나 docs 등을 찾아 넣어주면 된다.
양력과 음력 변환 테스트 코드 (PHP)
아래 테스트 코드는 블로거 파뿌리님이 올려주신 코드를 조금 쉽게 수정하여 테스트한 코드다.
출처 : https://www.pabburi.co.kr/content/
<?php
require_once '/usr/share/pear/KASI_Lunar.php';
require_once '/usr/share/pear/Lunar.php';
$lunar = new oops\Lunar;
// 양력과 음력을 변환해 보여줄 연도 설정
$year=1971;
for( $month = 1; $month <= 12; $month++ ) {
for ( $day = 1; $day <= 31; $day++ ) {
$month2 = sprintf("%02d", $month);
$day2 = sprintf("%02d", $day);
$dateYmd = "$year-$month2-$day2";
if ( !checkdate($month2, $day2, $year) ) continue;
// 양력을 음력으로
$result = $lunar->tolunar ($dateYmd);
$dateLunar = $result->fmt;
//음력을 양력으로
$result = $lunar->tosolar ($dateLunar);
$dateSolar = $result->fmt;
$dateSolar2 = '';
//양력을 음력으로 변환한 $dateLunar를 다시 양력으로 변환한 $dateSolar가 원래 양력인 $dateYmd와 다르면 윤달임
$eqName = ( $dateYmd == $dateSolar ) ? '평달':'윤달';
if ( $eqName == '윤달' ) {
//음력일자가 윤달이면 양력으로 변환할 때 tosolar 함수의 두번째 인자를 true로 넣어줘야 함
$result = $lunar->tosolar ($dateLunar, true); // 음력 -> 양력
$dateSolar2 = $result->fmt;
}
echo $eqName . " : (양력)" . $dateYmd . " -> (음력)" . $dateLunar. "-> (음력윤달)" . $dateLunar . " -> (양력)" . $dateSolar2 . "<br>";
}
}
// 음력을 양력으로 변환할때 윤달 여부를 입력받아 tosolar 함수의 두번째 인자를 true로 넣어줘야 하며
// 양력을 음력으로 변환할 때는 음력으로 변환한 날짜를 다시 양력으로 변환하여 원래의 양력과 일치하는지 확인하여 불일치할 경우 변환된 음력날자가 윤달임을 표시해줘야 함
?>
#php #양력과음력변환
답글 남기기