양력 -> 음력, 음력 -> 양력 변경 pear 패키지 > PHP
PHP

양력 -> 음력, 음력 -> 양력 변경 pear 패키지

조회 126회 댓글 0건

제가 만든것은 아니고 테스트 한것을 정리하여 올린 것입니다. 음력 -> 양력으로 변경하는 라이브러리 흔하고 간단할줄 알았는데 생각외로 복잡하고 제대로 되는것을 찾기도 쉽지 않았습니다.


여기선 PHP 8.1에서 테스트 한것입니다. PHP8 부터는 isset 같은것을 사용해야 되는 부분만 참고하면 되고 깃허브에 있는 예제가 모두 실행 되는것은 아니었습니다. 제가 필요한 음력, 양력으로 변경하는 부분이 문제가 없었습니다.


만세력의 문제점등 라이센스 관련하여 저에겐 없고 깃허브에 보면 자세히 설명이 되어 있습니다.

https://github.com/OOPS-ORG-PHP/Lunar 


1) pear 설치하기 위한 파일을 받는다.

wget https://pear.php.net/go-pear.phar



2) 아래 실행하고 엔터만 쳐주면 된다.

php는 설치한 방법에 따라서 위치가 아래와 다를 수 있습니다.

/usr/local/php8/bin/php go-pear.phar


위 결과에서 어디에 파일이 설치 되었는지 아래처럼 나온다.

The 'pear' command is now at your service at /opt/remi/php81/root/usr/bin/pear



3) 위 실행에서 pear이 설치된 디렉토리가 나오는데 나의 경우는 아래와 같다

https://github.com/OOPS-ORG-PHP/Lunar 나와 있는 설명대로 설치를 해줍니다.


/opt/remi/php81/root/usr/bin/pear channel-discover pear.oops.org

/opt/remi/php81/root/usr/bin/pear install oops/Lunar


위에 설치한것은 아래에 위치해 있는데 이것은 초기 pear 설치 할때 

"5. PHP code directory ($php_dir)" 부분에 위치를 보여주니 이것을 참고하면 됩니다.


ls -al /opt/remi/php81/root/usr/share/pear


cp -a /opt/remi/php81/root/usr/share/pear/KASI_Lunar* ./

cp -a /opt/remi/php81/root/usr/share/pear/Lunar* ./

cp -a /opt/remi/php81/root/usr/share/pear/myException.php ./


pear를 통해서 설치한것은 위처럼 복사를 하는것은 아니고 바로 include 해서 사용하면 되지만 여기선 오류가 발생하는 관계로 확인 하기 위해서 좀 옮겼습니다.

그리고 첨부된 파일은 위처럼 복사한 것입니다.



  <?
  require_once './KASI_Lunar.php';
  require_once './Lunar.php';

  $lunar = new oops\Lunar;

  // # 음력 -> 양력
  // $date   = '2024-01-01'; // 음력 1월 1일
  // $result   = $lunar->tosolar ($date);
  // print_r($result);

  // # 양력 -> 음력
  // $date     = $result->fmt;
  // $result   = $lunar->tolunar ($date);
  // print_r ($result);

  // # 2020년 부터 2040년까지
  for( $year=2023; $year<=2040; $year++) {
    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 = '';

        # 다른 결과가 나오면 윤달인것이다.
        $eqName   = ( $dateYmd == $dateSolar ) ? '  ':'다름';
        if ( $eqName == '다름' ) {
          $result   = $lunar->tosolar ($dateLunar, true);  // 음력 -> 양력
          $dateSolar2 = $result->fmt;
        }
        echo "$eqName: $dateYmd -> $dateLunar -> $dateSolar($dateSolar2)" . PHP_EOL;
      }
    }
  }

  # 음력을 양력으로 변환할때도 윤달을 체크 해야 하나?
  // 다름: 2023-03-22(양력) -> 2023-02-01(음력) -> 2023-02-20(2023-03-22) - 윤달적용
  // 다름: 2023-03-23(양력) -> 2023-02-02(음력) -> 2023-02-21(2023-03-23) - 윤달적용
  // 다름: 2023-03-24(양력) -> 2023-02-03(음력) -> 2023-02-22(2023-03-24) - 윤달적용
  // 다름: 2023-03-25(양력) -> 2023-02-04(음력) -> 2023-02-23(2023-03-25) - 윤달적용
  // 다름: 2023-03-26(양력) -> 2023-02-05(음력) -> 2023-02-24(2023-03-26) - 윤달적용
  // 다름: 2023-03-27(양력) -> 2023-02-06(음력) -> 2023-02-25(2023-03-27) - 윤달적용
  // 다름: 2023-03-28(양력) -> 2023-02-07(음력) -> 2023-02-26(2023-03-28) - 윤달적용
  // 다름: 2023-03-29(양력) -> 2023-02-08(음력) -> 2023-02-27(2023-03-29) - 윤달적용
  // 다름: 2023-03-30(양력) -> 2023-02-09(음력) -> 2023-02-28(2023-03-30) - 윤달적용
  // 다름: 2023-03-31(양력) -> 2023-02-10(음력) -> 2023-03-01(2023-03-31) - 윤달적용
  // 다름: 2023-04-01(양력) -> 2023-02-11(음력) -> 2023-03-02(2023-04-01) - 윤달적용
  // 다름: 2023-04-02(양력) -> 2023-02-12(음력) -> 2023-03-03(2023-04-02) - 윤달적용
  // 다름: 2023-04-03(양력) -> 2023-02-13(음력) -> 2023-03-04(2023-04-03) - 윤달적용
  // 다름: 2023-04-04(양력) -> 2023-02-14(음력) -> 2023-03-05(2023-04-04) - 윤달적용
  // 다름: 2023-04-05(양력) -> 2023-02-15(음력) -> 2023-03-06(2023-04-05) - 윤달적용
  // 다름: 2023-04-06(양력) -> 2023-02-16(음력) -> 2023-03-07(2023-04-06) - 윤달적용
  // 다름: 2023-04-07(양력) -> 2023-02-17(음력) -> 2023-03-08(2023-04-07) - 윤달적용
  // 다름: 2023-04-08(양력) -> 2023-02-18(음력) -> 2023-03-09(2023-04-08) - 윤달적용
  // 다름: 2023-04-09(양력) -> 2023-02-19(음력) -> 2023-03-10(2023-04-09) - 윤달적용
  // 다름: 2023-04-10(양력) -> 2023-02-20(음력) -> 2023-03-11(2023-04-10) - 윤달적용
  // 다름: 2023-04-11(양력) -> 2023-02-21(음력) -> 2023-03-12(2023-04-11) - 윤달적용
  // 다름: 2023-04-12(양력) -> 2023-02-22(음력) -> 2023-03-13(2023-04-12) - 윤달적용
  // 다름: 2023-04-13(양력) -> 2023-02-23(음력) -> 2023-03-14(2023-04-13) - 윤달적용
  // 다름: 2023-04-14(양력) -> 2023-02-24(음력) -> 2023-03-15(2023-04-14) - 윤달적용
  // 다름: 2023-04-15(양력) -> 2023-02-25(음력) -> 2023-03-16(2023-04-15) - 윤달적용
  // 다름: 2023-04-16(양력) -> 2023-02-26(음력) -> 2023-03-17(2023-04-16) - 윤달적용
  // 다름: 2023-04-17(양력) -> 2023-02-27(음력) -> 2023-03-18(2023-04-17) - 윤달적용
  // 다름: 2023-04-18(양력) -> 2023-02-28(음력) -> 2023-03-19(2023-04-18) - 윤달적용
  // 다름: 2023-04-19(양력) -> 2023-02-29(음력) -> 2023-03-20(2023-04-19) - 윤달적용

  # 음력 -> 양력 - 윤달 체크를 해야 한다.
  $date   = '2023-02-01';
  $result   = $lunar->tosolar($date, true);
  echo "음력 -> 양력: $date -> {$result->fmt}" . PHP_EOL;

  # 양력 -> 음력
  $date     = $result->fmt;
  $result   = $lunar->tolunar($date);
  echo "양력 -> 음력: $date -> {$result->fmt}" . PHP_EOL;
  exit;

  ?>
 

여기서 윤달을 체크 하는 방법은 음력으로 변경하고 변경된 음력을 다시 양력으로 변경하여 날짜가 같은지 다른지 확인하여 다르면 윤달이라고 보는 방식 입니다.

** 참고할것 **
- 양력 -> 음력은 문제 발견 못함
- 음력 -> 양력 윤달 체크 하면서 2100년까지 생성 하다 보면 오류 보게 됨.
- 이 라이브러리는 년도로 봤을때 PHP7 에서 만들어진것으로 추정

  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
첨부파일
전체 198건 1 페이지
  • profile_image PHP만 그런것은 아니지만 지원하는 기간이 너무 짧습니다.세월은 생각보다 너무 짜르게 흘러가서 업그레이드 하다가 시간 다 보내겠어요~ 오늘자 기준으로 PHP 지원되는 버전을 확인해 봤는데 이렇네요~대부분 PHP 7 많이 사용하고 있을텐데 보안 업그레이드도 종료 된지 한참 입니다.사용자가 기능 업그레이드 보다 보안 업그레이드 기간 길게 가져가 달라고 하는게 맞을 텐데...
  • profile_image 서비스용이 아니라 쉘에서 실행하는 용도로 설치 하기 위한것으로 별도의 환경설정 필요 없이 이정도만 해주면 당장 쉘에서 사용하는데는 지장이 없다.▷ 난 이렇게 버전별로 심볼릭 링크를 걸어서 사용 한다./usr/localln -s /opt/remi/php83/root/usr/ php83▷ 이전 버전에서 목록을 보고 당장 필요한것만 골라 보았다.목록을 확인하는 방법은 yum search php83 명령을 통해서 가능하다. opcachecurlbcmathctypedomexiffileinfogdiconvjsonmbstringsimplexmlsnmpsocketsxmlxmlwritermcryptmysqlibrotlicrypto▷ 위…
  • profile_image 언어도 용도에 따라 적합한쪽의 것을 사용하는것 처럼 함수와 클래스 어느것이 위에 있고 아래에 있는것은 아닙니다. 용도에 따라 훨씬 좋은 방식으로 사용 할 수 있는 것이죠 예를 들면 시장에서 닭을 자를 때 쓰는칼과 요리할때 야채를 써는 칼은 서로 용도가 다른것 처럼 말입니다. * 함수1-1) 함수 장점- 간단함: 함수를 정의하고 불러오는 방식이 매우 직관적입니다.- 초기 학습 곡선이 낮음: 객체 지향 프로그래밍(OOP)에 대한 이해가 필요 없습니다.- 가벼움: 클래스의 오버헤드 없이 필요한 함수만 불러올 수 있습니다.1-2) 함수 단점- 네임스페이스 충돌: 여러 파일에서 동일한 이름의 함수가 있을 경우 충돌이 발생할 수 …
  • profile_image 앞으로 @ 사용하지 말라고 하니 새로 만드는 프로그램은 try-catch 감싸서 처리 하는 것이 좋다.그래서 필요한 것으로 아래를 참고하면 된다. 그리고 아래 복원하는 함수면 한 줄이기 때문에 함수가 왜? 필요할까 싶지만 이런 경우도 함수로 만들어 사용하면 후에 어려운 일이 발생 했을 때 해결 할 수 있는 좋은 일이 생기게 되기도 한다.  # 사용자 오류처리기   convertErrorsToExceptions();   #   try {    $link = "https://www.test2341.com";    $html = file_get_contents($link, false, null);  } catch (Error…
  • profile_image 내장함수에 strip_tags 라는 것이 있습니다.HTML을 삭제하고 txt만 남기죠. 그리고 나서 공백이 2개 이상이거나 줄바꿈이 필요 없거나 탭 같은것은 별도 삭제를 해줘야 합니다. 여기서 다루는 함수는 자바스크립트등 몇가지를 더 삭제해 주는 기능입니다.결과 확인 후 본인에게 맞지 않으면 좀 더 추가 해야 될 수 있는데 요즘은 GPT4 이용하면 도움이 많이 됩니다.  /**   * html2txt    *    * @param mixed $document    * @return string|string[]|null    */  function strip_tags_html2txt($document) {    $sear…
  • profile_image 사이트의 페이지를 소켓방식으로 수집할때 많이 사용하는 curl 클래스 입니다.본인의 상황에 따라서 좀더 조건을 줘서 처리를 하면 되며 쿠키를 저장해서 다시 보내줘야 한 다면 이 부분에 대한 주석 처리 된것을 풀어서 테스트 해보면 됩니다.중요한것은 HTTP 프로토콜에 대한 명확한 이해가 가장 중요합니다.원리를 모르는 상태에서 사용을 하다보면 헛발질을 많이 할 수 밖에 없기 때문이죠~코딩을 잘 한다는 것은 깔끔하게 재사용가능하게 하는 것도 중요하지만 더 중요한 것은 원리를 이해하고 문제를 해결 하는 것입니다.  // 변수 선언  $http_url   = 'http://example.com';  $method     = 'g…
  • profile_image AWS SES API를 활용하면서 PEAR 라이브러리 활용할 필요가 있을 때 사용하면 되지만 일반적으로는 사용할 필요는 없습니다.하지만 필요한 분이 있을 수 있어 예전 소스중에 있어 올립니다. 1) PEAR 설치 사용하는 PHP 버전의 경로를 지정해서 설치 해야 한다. wget https://pear.php.net/go-pear.phar /usr/local/php82/bin/php go-pear.phar /usr/local/php82/bin/php -r "include 'PEAR.php';" 2) MIME 라이브러리 압축을 푼 다음 폴더를 옮겨 사용해야 한다. 라이브러리에서 또다른 파일 include 하면서 경로 문제 …
  • profile_image AWS에서 메일을 발송하는 방법에는 SMTP 설정을 통한 방법이 있고 다른 하나는 API를 이용한 방법이 있는데여기에선 API를 이용한 방법에 대한 예 입니다.보통 간단하게 조금 보낼때는 관계 없는데 많이 보내게 되면 AWS 비용이 비싸고 반송 메일에 따라 좋지 않으면 패널티도 받기 때문에 AWS 이용은 많이 안하는 편입니다.대량메일 발송서비스만 전문으로 해주는곳을 이용하거나 직접 구축하여 발송을 하게 됩니다.한달 몇 천건 정도면 이것 이용해도 됩니다.  require __DIR__ . '/../aws/aws-autoloader.php';  use Aws\Ses\SesClient;  use Aws\Exception\Aw…