Source for file Lunar.php
Documentation is available at Lunar.php
* Project: Lunar :: 양력/음력 변환 클래스<br>
* 이 패키지는 양력/음력간의 변환을 제공한다.
* 1852년 10월 15일 이전의 양력 날자는 율리우스력으로 취급을 하며, 내부
* 계산시에 그레고리력으로 변환을 하여 계산을 한다.
* 이 변환 API의 유효기간은 다음과 같다.
* + -2087-02-09(음력 -2087-01-01) ~ 6078-01-29(음 6077-12-29)
* + -2087-07-05(음력 -2087-05-29) 이전은 계산이 무지 느려짐..
* + -4712-02-08 ~ 9999-12-31
* + API의 연도 체크가 4자리 까지이므로 10000년 이상은 확인 못함
* + 64bit 계산이 가능한 시점까지 가능할 듯..
* + 기원전의 경우 Julian date가 BC 4713년 1월 1일 부터이므로
* Gregorian calendar 변환이 가능한 BC 4713년 2월 8일부터 가능
* 계산 처리 시간상, 과거 2000년전과 미래 100년후의 시간은 왠만하면 웹에서는
* oops\KASI_Lunar pear package를 설치한 후에, KASI_Lunar.php 를 include 하면,
* 내부적으로 1391-02-05 ~ 2050-12-31 기간은 천문과학연구원의 음양력 DB를 이용하여
* Lunar package는 2가지 라이센스를 가지고 있다. Lunar 패키지의
* Core API (Lunar/Lunar_API.php)는 고영창님의 '진짜만세력' 코드를 PHP로
* 포팅한 것으로, 고영창님에게 라이센스가 있으며, front end API(Lunar.php)는
* 김정균이 작성한 코드들로 BSD license를 따른다.
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2024, OOPS.org
* @license BSD (Lunar.php) And 고영창(Lunar/Lunar_API.php)
* @link https://github.com/OOPS-ORG-PHP/Lunar
* @since File available since release 0.0.1
* @example Lunar/tests/test.php Sample code
* import myException class
require_once 'myException.php';
require_once 'Lunar/Lunar_API.php';
* 이 패키지는 양력/음력간의 변환을 제공한다.
* 1852년 10월 15일 이전의 양력 날자는 율리우스력으로 취급을 하며, 내부
* 계산시에 그레고리력으로 변환을 하여 계산을 한다.
* 이 변환 API의 유효기간은 다음과 같다.
* + -2087-02-09(음력 -2087-01-01) ~ 6078-01-29(음 6077-12-29)
* + -2087-07-05(음력 -2087-05-29) 이전은 계산이 무지 느려짐..
* + -4712-02-08 ~ 9999-12-31
* + API의 연도 체크가 4자리 까지이므로 10000년 이상은 확인 못함
* + 64bit 계산이 가능한 시점까지 가능할 듯..
* + 기원전의 경우 Julian date가 BC 4713년 1월 1일 부터이므로
* Gregorian calendar 변환이 가능한 BC 4713년 2월 8일부터 가능
* 계산 처리 시간상, 과거 2000년전과 미래 100년후의 시간은 왠만하면 웹에서는
* oops\KASI_Lunar pear package를 설치한 후에, KASI_Lunar.php 를 include 하면,
* 내부적으로 1391-02-05 ~ 2050-12-31 기간은 천문과학연구원의 음양력 DB를 이용하여
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2024, OOPS.org
* @license BSD (Lunar.php) And 고영창(Lunar/Lunar_API.php)
* @example Lunar/tests/test.php Sample code
// {{{ +-- public version (void)
* oops\Lunar package 의 버전을 반환.
# 관리를 위하여 single quote 를 사용할 것!
// {{{ +-- public (array) toargs ($v, $lunar = fasle)
* 입력된 날자 형식을 연/월/일의 멤버를 가지는 배열로 반환한다.
* 입력된 변수 값은 YYYY-MM-DD 형식으로 변환 된다.
* {@example Lunar/tests/sample.php 30 25}
* - unixstmap (1970년 12월 15일 이후부터 가능)
public function toargs (&$v, $lunar = false) {
$y = (int) date ('Y', $v);
$m = (int) date ('m', $v);
$d = (int) date ('d', $v);
if ( preg_match ('/^(-?[0-9]{1,4})[\/-]?([0-9]{1,2})[\/-]?([0-9]{1,2})$/', trim ($v), $match) ) {
list ($y, $m, $d) = $match;
throw new \ myException ('Invalid Date Format', E_USER_WARNING);
// 넘어온 날자가 음력일 경우 아래가 실행되면 측정 날자가 달라질 수 있다.
if ( ! $lunar && $y > 1969 && $y < 2038 ) {
$fixed = mktime (0, 0, 0, $m, $d, $y);
$y = (int) date ('Y', $fixed);
$m = (int) date ('m', $fixed);
$d = (int) date ('d', $fixed);
if ( $m > 12 || $d > 31 ) {
throw new \ myException ('Invalid Date Format', E_USER_WARNING);
$v = $this->regdate (array ($y, $m, $d));
return array ($y, $m, $d);
// {{{ +-- public (string) human_year ($y)
* 연도를 human readable하게 표시
* {@example Lunar/tests/sample.php 56 11}
* @return string AD/BC type의 연도
// {{{ +-- public (array) split_date ($date)
* YYYY-MM-DD 또는 array ((string) YYYY, (string) MM, (string) DD)
* 입력값을 * array ((int) $y, (int) $m, (int) $d)으로 변환
* @return array array ((int) $y, (int) $m, (int) $d)
* - array ((string) YYYY, (string) MM, (stirng) DD)
$date = $this->regdate ($date);
$minus = ($date[0] == '-') ? true : false;
$date = $minus ? substr ($date, 1) : $date;
foreach ($r as $k => $v )
// {{{ +-- private (string) regdate ($v)
* @return string YYYY-MM-DD 형식으로 반환
* @param array 년월일 배열 - array ($year, $month, $day)
private function regdate ($v) {
list ($year, $month, $day) = $v;
($month < 10 ) ? '0' : '',
// {{{ +-- public (bool) is_leap ($y, $julian = false)
* {@example Lunar/tests/sample.php 68 14}
* 1582년 이전은 Julian calender로 판단하여 이 값이
* false라도 율리우스력으로 간주하여 판단한다. (sinse 1.0.1)
public function is_leap ($y, $julian = false) {
// Julian의 윤년은 4로 나누어지면 된다.
if ( $julian || $y < 1583 )
return ($y % 4) ? false : true;
if ( ($y % 4) == 0 && ($y % 100) != 0 )
// {{{ +-- public (bool) is_gregorian ($y, $m, $d = 1)
* 해당 날자가 gregorian 범위인지 체크
// {{{ +-- private (string) gregorian2julian ($v)
* [fmt] => 2013-06-09 // YYYY-MM-DD 형식의 Julian 날자
* @param array|intGregorian 연월일 배열 or Julian date count
private function gregorian2julian ($v) {
$d = $this->regdate ($v);
$v = $this->cal2jd (array ($y, $m, $d));
'fmt' => $this->regdate (array ($r->year, $r->month, $r->day)),
$alpha = (int) ($Z - 1867216.25 / 36524.25);
$A = $Z + 1 + $alpha - (int) ($alpha / 4);
$C = (int) (($B - 122.1) / 365.25);
$D = (int) (365.25 * $C);
$E = (int) ( ($B - $D) / 30.6001);
$day = $B - $D - (int) (30.6001 * $E) + $F;
$month = ($E < 14) ? $E - 1 : $E - 13;
'fmt' => $this->regdate (array ($year, $month, $day)),
// {{{ +-- private mod ($x, $y)
private function mod ($x, $y) {
return ($x % $y + $y) % $y;
// {{{ +-- private (string) julian2gregorian ($v)
* [fmt] => 2013-06-09 // YYYY-MM-DD 형식의 Julian 날자
* @param array|intJulian 연월일 배열 or Julian date count
private function julian2gregorian ($jd, $pure = false) {
$jd = $this->cal2jd (array ($y, $m, $d), true);
'fmt' => $this->regdate (array ($r->year, $r->month, $r->day)),
// https://en.wikipedia.org/wiki/Julian_day#Gregorian_calendar_from_Julian_day_number
// 01-01-02 부터 이전은 맞지 않는다 --;
#$f = (int) ($f + (((4 * $jd + 274277) / 146097) * 3) / 4 - 38);
#$g = (int) (($e % 1461) / 4);
#$day = (int) (($h % 153) / 5 + 1);
#$month = (int) ((($h / 153 + 2) % 12) + 1);
#$year = (int) ($e / 1461 - 4716 + (12 + 2 - $month) / 12);
// http://www.fourmilab.ch/documents/calendar/
$wjd = floor ($jd - 0.5) + 0.5;
# GREGORIAN_EPOCH 1721425.5
$depoch = $wjd - 1721425.5;
$quadricent = floor ($depoch / 146097);
$dqc = $this->mod ($depoch, 146097);
$cent = floor ($dqc / 36524);
$dcent = $this->mod ($dqc, 36524);
$quad = floor ($dcent / 1461);
$dquad = $this->mod ($dcent, 1461);
$yindex = floor ($dquad / 365);
$year = ($quadricent * 400) + ($cent * 100) + ($quad * 4) + $yindex;
if ( ! ($cent == 4 || $yindex == 4) )
$yearday = $wjd - $this->cal2jd (array ($year, 1, 1));
$leapadj = (($wjd < $this->cal2jd (array ($year, 3, 1)))
? 0 : ($this->is_leap ($year) ? 1 : 2));
$month = floor (((($yearday + $leapadj) * 12) + 373) / 367);
$day = ceil ($wjd - $this->cal2jd (array ($year, $month, 1))) + 1;
'fmt' => $this->regdate (array ($year, $month, $day)),
// {{{ +-- private (int) cal2jd_pure ($v, $julian = false)
* Gregorian 날자를 Julian date로 변환 (by PURE PHP CODE)
* http://new.astronote.org/bbs/board.php?bo_table=prog&wr_id=29929
* 1. Y는 해당년도, M는 월(1월=1,2월=2), D는 해당 월의 날짜이다.
* D는 시간값도 포함한 소수값으로 생각하자. 가령 3일 12시 UT라면
* 2. M>2인 경우 Y,M은 변경하지 않는다. M = 1 또는 2인 경우 Y=Y-1,
* 3. 그레고리력(Gregorian Calendar)의 경우 아래처럼 계산한다.
* A = INT(Y/100), B = 2 – A + INT(A/4)
* 여기서 INT는 ()안에 들어간 값을 넘지않는 가장 큰 정수이다.
* 율리우스력(Julian Calendar)의 경우 B=0이다.
* JD = INT(365.25(Y+4716)) + INT(30.6001(M+1)) + D + B – 1524.5
* 여기서 30.6001은 정확히는 30.6을 써야한다. 하지만 컴퓨터 계산시
* 10.6이여 하는데 10.599999999 이런식으로 표현되는 경우가 발생하면
* INT(10.6)과 INT(10.5999..)의 결과가 달라진다. 이 문제 대해 대처
* 하기 위해 30.6001을 사용한 것이다. 이러한 에러를 Round-off Error
* @return int Julian date
* @param array 연월일 배열 : array ($y, $m, $d)
private function cal2jd_pure ($v, $julian = false) {
$B = $julian ? 0 : 2 - $A + (int) ($A / 4);
$C = (int) (365.25 * ($y + 4716));
$D = (int) (30.6001 * ($m + 1));
return ceil ($C + $D + $d + $B - 1524.5);
// {{{ +-- private (int) cal2jd_ext ($v, $julian = false)
* Gregorian 날자를 Julian date로 변환 (by Calendar Extension)
* @return int Julian date
* @param array 연월일 배열 : array ($y, $m, $d)
private function cal2jd_ext ($v, $julian = false) {
$func = $julian ? 'JulianToJD' : 'GregorianToJD';
$r = $func ((int) $m, (int) $d, (int) $y);
// {{{ +-- public (int) cal2jd ($v)
* Gregorian 날자를 Julian date로 변환
* @return int Julian date
* @param array 연월일 배열 : array ($y, $m, $d)
public function cal2jd ($v, $julian = false) {
return $this->cal2jd_ext ($v, $julian);
return $this->cal2jd_pure ($v, $julian);
// {{{ +-- private (string) toutc ($v)
* @return string YYYY-MM-DD-HH-II-SS
* @param string date format (YYYY-MM-DD HH:II:SS)
private function toutc ($v) {
$r = date ('Y-m-d-H-i-s', $t);
// {{{ +-- private (int) to_utc_julian ($v)
* 합삭/망 절기 시간을 UTC로 변환 후, Julian date로 표현
* @param string data format (YYYY-MM-DD HH:II:SS)
private function to_utc_julian ($v) {
$buf = $this->toutc ($v);
list ($y, $m, $d, $h, $i, $s) = $this->split_date ($buf);
//$julian = ( $chk < 18451015 ) ? $true : false;
$j = $this->cal2jd (array ($y, $m, $d), $julian);
$buf = (($h * 3600 + $i * 60) / 86400) * - 1;
$buf = (($h - 12) * 3600 + $i * 60) / 86400;
// {{{ +-- private (array) fix_calendar ($y, $m, $d)
* 1582년 10월 15일 이전의 date를 julian calendar로 변환
* @return array 년월일 배열 (array ($y, $m, $d))
private function fix_calendar ($y, $m, $d) {
# 15821005 ~ 15821014 까지는 gregorian calendar에서는 존재
# 하지 않는다. 그러므로, 이 기간의 날자는 julian calendar
# 와 매치되는 날자로 변경한다. (10씩 빼준다.
if ( $chk > 15821004 && $chk < 15821015 ) {
$julian = $this->cal2jd (array ($y, (int) $m, (int) $d));
$r = $this->julian2gregorian ($julian);
list ($y, $m, $d) = array ($r->year, $r->month, $r->day);
# 15821005 보다 과거의 날자는 gregorian calendar가 없다.
# 그러므로 julian calendar로 표현한다.
if ( $this->is_gregorian ($y, (int) $m, (int) $d) === false ) {
$r = $this->julian2gregorian (array ($y, (int) $m, (int) $d));
list ($y, $m, $d) = array ($r->year, $r->month, $r->day);
return array ($y, $m, $d);
// {{{ +-- public (object) tolunar ($v = null)
* 진짜 만세력은 1582/10/15(Gregorian calendar의 시작) 이전의 날자
* 역시 Gregorian으로 표기를 한다. 그러므로 Calendar의 오류로 보일
* 수도 있다. (실제로는 계산상의 오류는 없다고 봐야 한다.)
* 이런 부분을 보정하기 위하여, tolunar method는 1582/10/04 까지의
* 날자는 julian calendar로 변환을 하여 음력날자를 구한다. 이로 인
* 하여 1582/10/15 이전의 음력 날자는 original 진짜 만세력과 다른
* 이렇게 표현될 경우, 천문우주 지식정보의 값과 비슷하게 나올 수는
* 있으나, 평달/큰달 계산은 진짜 만세력의 것을 이용하므로 오차는
* http://astro.kasi.re.kr/Life/ConvertSolarLunarForm.aspx?MenuID=115
* 2.0 부터는 이러한 오차를 줄이기 위하여 oops\KASI_Lunar package가
* 설치되어 있을 경우, 1392-02-05 ~ 2050-12-31 기간에 대해서는
* 천문과학연구원의 데이터를 이용할 수 있도록 지원한다.
* {@example Lunar/tests/sample.php 83 35}
* @return stdClass 음력 날자 정보 반환
* [fmt] => 2013-06-09 // YYYY-MM-DD 형식의 음력 날자
* [hyear] => AD 2013 // AD/BC 형식의 연도
* [largemonth] => 1 // 평달/큰달 여부
* [unixstamp] => 1373900400 // unixstamp (양력 날자)
* [hganji] => 癸巳 // 한자 세차
* [hgan] => 癸 // 세차 한자 10간
* [hji] => 巳 // 세차 한자 12지
* - unixstmap (1970년 12월 15일 이후부터 가능)
* - 1582년 10월 15일 이전의 날자는 율리우스력의 날자로 취급함.
public function tolunar ($v = null) {
list ($y, $m, $d) = $this->toargs ($v);
#printf ("** %4s.%2s.%2s ... ", $y, $m, $d);
// 1391-02-05 ~ 2050-12-31 까지는 KASI data로 처리를 한다.
if ( $cdate > 13910204 && $cdate < 20510101 ) {
if ( $this->KASI == null )
$this->KASI = new \ oops\ KASI\ Lunar;
# Lunar_KASI::tolunar method 는 1391-02-05 ~ 2050-12-31 구간을 벗어나면 Exception 을
# 발생 시킨다. 그러므로 예외 처리가 필요하다. 하지만 여기서는 상단에 이미 에외 구간을
# 제한하고 있어, 딱히 예외 처리를 할 필요는 없다.
$r = $this->KASI->tolunar ($v);
$r = array ($year, $month, $day);
list ($y, $m, $d) = $this->fix_calendar ($y, $m, $d);
#printf ("%4s.%2s.%2s<br>", $y, $m, $d);
list ($year, $month, $day, $leap, $lmonth) = $r;
if ( $k1 < 0 ) $k1 += 10;
if ( $k2 < 0 ) $k2 += 12;
'fmt' => $this->regdate ($r),
'week' => $this->week[$w],
'hweek' => $this->hweek[$w],
'unixstamp' => mktime (0, 0, 0, $m, $d, $y),
'ganji' => $this->gan[$k1] . $this->ji[$k2],
'hganji' => $this->hgan[$k1] . $this->hji[$k2],
'gan' => $this->gan[$k1],
'hgan' => $this->hgan[$k1],
'hji' => $this->hji[$k2],
// {{{ +-- public (object) tosolar ($v = null, $leap = false)
* 구하는 음력월이 윤달인지 여부를 알 수 없을 경우, tosolar method
* 를 실행하여 얻은 양력 날자를 다시 tolunar로 변환하여 비교하여
* 동일하지 않다면, 윤달 파라미터 값을 주고 다시 구해야 한다!
* 진짜 만세력은 Gregorian으로 표기를 하기 때문에, 양력 1582-10-15
* 이전의 경우에는 return object의 julian member 값으로 비교를 해야
* {@example Lunar/tests/sample.php 119 42}
* @return stdClass 양력 날자 정보 object 반환
* [jd] => 2456527 // Julian Date Count
* [fmt] => 2013-07-16 // YYYY-MM-DD 형식의 양력 날자 (15821015 이전은 율리우스력)
* [gregory] => 2013-07-16 // Gregory Calendar
* [julian] => 2013-08-09 // Julian Calendar
* [dangi] => 4346 // 단기 (양력)
* [hyear] => AD 2013 // AD/BC 형식 년도
* [year] => 2013 // 양력 연도
* [unixstamp] => 1373900400 // unixstamp (양력)
* [hganji] => 癸巳 // 세차 한자
* [hgan] => 癸 // 세차 한자 10간
* [hji] => 巳 // 세차 한자 12지
* - unixstmap (1970년 12월 15일 이후부터 가능)
public function tosolar ($v = null, $leap = false) {
list ($y, $m, $d) = $this->toargs ($v, true);
// 1391-01-01 ~ 2050-12-31 까지는 KASI data로 처리를 한다.
if ( $cdate > 13910101 && $cdate < 20501119 ) {
if ( $this->KASI == null )
$this->KASI = new \ oops\ KASI\ Lunar;
# Lunar_KASI::tosolar method 는 1391-01-01 ~ 2050-12-31 구간을 벗어나면 Exception 을
# 발생 시킨다. 그러므로 예외 처리가 필요하다. 하지만 여기서는 상단에 이미 에외 구간을
# 제한하고 있어, 딱히 예외 처리를 할 필요는 없다.
$r = $this->KASI->tosolar ($v, $leap);
$j = $this->gregorian2julian ($r->jd);
$g = $this->julian2gregorian ($r->jd);
list ($year, $month, $day) = $r;
//$julian = $this->gregorian2julian ($r);
$julian = $this->gregorian2julian ($jdate);
$gfmt = $this->regdate ($r);
$fmt = ($jdate < 2299161) ? $jfmt : $gfmt;
if ( $k1 < 0 ) $k1 += 10;
if ( $k2 < 0 ) $k2 += 12;
'week' => $this->week[$w],
'hweek' => $this->hweek[$w],
'unixstamp' => mktime (0, 0, 0, $month, $day, $year),
'ganji' => $this->gan[$k1] . $this->ji[$k2],
'hganji' => $this->hgan[$k1] . $this->hji[$k2],
'gan' => $this->gan[$k1],
'hgan' => $this->hgan[$k1],
'hji' => $this->hji[$k2],
// {{{ +-- public (object) dayfortune ($v = null)
* 세차(년)/월건(월)/일진(일) 데이터를 구한다.
* {@example Lunar/tests/sample.php 163 56}
* [data] => stdClass Object
* [hyear] => 癸巳 // 한자 세차 값
* [hmonth] => 己未 // 한자 월건 값
* [hday] => 癸未 // 한자 일진 값
* - unixstmap (1970년 12월 15일 이후부터 가능)
* - 1582년 10월 15일 이전의 날자는 율리우스력의 날자로 취급함.
list ($y, $m, $d) = $this->toargs ($v);
list ($y, $m, $d) = $this->fix_calendar ($y, $m, $d);
list ($so24, $year, $month, $day, $hour)
'data' => (object) array ('y' => $year, 'm' => $month, 'd' => $day),
'year' => $this->ganji[$year],
'month' => $this->ganji[$month],
'day' => $this->ganji[$day],
'hyear' => $this->hganji[$year],
'hmonth' => $this->hganji[$month],
'hday' => $this->hganji[$day],
// {{{ +-- public (object) s28day ($v = null)
* {@example Lunar/tests/sample.php 221 35}
* [data] => 5 // 28수 index
* - unixstmap (1970년 12월 15일 이후부터 가능)
* - 1582년 10월 15일 이전의 날자는 율리우스력의 날자로 취급함.
* - Recursion s28day return value:<br>
* loop에서 s28day method를 반복해서 호출할 경우 return value를 이용할
* 경우, return value의 index값을 이용하여 계산을 하지 않아 속도가 빠름.
public function s28day ($v = null) {
list ($y, $m, $d) = $this->toargs ($v);
list ($y, $m, $d) = $this->fix_calendar ($y, $m, $d);
// {{{ +-- public (array) seasondate ($v = null)
* 해당 양력일에 대한 음력 월의 절기 시간 구하기
* 2.0.1 부터는 KASI-Lunar 2.0.0 이상이 설치 되어 있을 경우,
* 천문과학연구원의 2004~2026 의 절기 데이터를 이용한다.
* {@example Lunar/tests/sample.php 257 52}
* @return stdClass 현달 초입/중기와 다음달 초입 데이터 반환
* [center] => stdClass Object // 이번달 초입 데이터
* [hname] => 小暑 // 절기 한자 이름
* [hyear] => AD 2013 // AD/BC 형식 연도
* [year] => 2013 // 초입 연도
* [julian] => 2456480.4506944 // Julian date (UTC)
* [ccenter] => stdClass Object // 이번달 중기 데이터
* [hname] => 大暑 // 절기 한자 이름
* [hyear] => AD 2013 // AD/BC 형식 연도
* [year] => 2013 // 중기 연도
* [julian] => 2456496.1743056 // Julian date (UTC)
* [nenter] => stdClass Object // 다음달 초입 데이터
* [hname] => 立秋 // 절기 한자 이름
* [hyear] => AD 2013 // AD/BC 형식 연도
* [year] => 2013 // 초입 연도
* [julian] => 2456511.8583333 // Julian date (UTC)
* - unixstmap (1970년 12월 15일 이후부터 가능)
* - 1582년 10월 15일 이전의 날자는 율리우스력의 날자로 취급함.
list ($y, $m, $d) = $this->toargs ($v);
list ($y, $m, $d) = $this->fix_calendar ($y, $m, $d);
$inginame, $ingiyear, $ingimonth, $ingiday, $ingihour, $ingimin,
$midname, $midyear, $midmonth, $midday, $midhour, $midmin,
$outginame, $outgiyear, $outgimonth, $outgiday, $outgihour, $outgimin
$j_ce = $this->to_utc_julian (
$this->regdate (array ($ingiyear, $ingimonth, $ingiday)),
$ingihour < 10 ? '0' . $ingihour : $ingihour,
$ingimin < 10 ? '0' . $ingimin : $ingimin
// 1852-10-15 이전이면 julian으로 변경
if ( $this->is_gregorian ($ingiyear, $ingimonth, $ingiday) === false ) {
$r = $this->gregorian2julian (array ($ingiyear, $ingimonth, $ingiday));
$j_cc = $this->to_utc_julian (
$this->regdate (array ($midyear, $midmonth, $midday)),
$midhour < 10 ? '0' . $midhour : $midhour,
$midmin < 10 ? '0' . $midmin : $midmin
// 1852-10-15 이전이면 julian으로 변경
if ( $this->is_gregorian ($midyear, $midmonth, $midday) === false ) {
$r = $this->gregorian2julian (array ($midyear, $midmonth, $midday));
$j_ne = $this->to_utc_julian (
$this->regdate (array ($outgiyear, $outgimonth, $outgiday)),
$outgihour < 10 ? '0' . $outgihour : $outgihour,
$outgimin < 10 ? '0' . $outgimin : $outgimin
// 1852-10-15 이전이면 julian으로 변경
if ( $this->is_gregorian ($outgiyear, $outgimonth, $outgiday) === false ) {
$r = $this->gregorian2julian (array ($outgiyear, $outgimonth, $outgiday));
'center' => (object) array (
'ccenter' => (object) array (
'nenter' => (object) array (
# KASI-Lunar package 가 있으면, 천문과학연구원의 2004~2026년도 절기 데이터를
if ( $this->KASI == null )
$this->KASI = new \ oops\ KASI\ Lunar;
# KASI-Lunar > 2.0.0 부터 사용 가능하다.
# season method 가 없으면 진짜만세력 절기 데이터를 그냥 반환한다.
foreach ( $r as $k => $v ) {
# 2004-01 ~ 2026-12 이 후의 범위에서 Exception 이 발생하므로 예외 처리를 해 줘야 한다.
# KASI_Lunar 2.0.1 부터는 KASI_Lunar::is_exception = false; 설정으로 Exception 를
$kv = $this->KASI->season ($r->{$k}->name, $r->{$k}->year);
$r->{$k}->month = $kv->month;
$r->{$k}->day = $kv->day;
$r->{$k}->hour = $kv->hour;
$r->{$k}->julian = $this->to_utc_julian (
$this->regdate (array ($r->{$k}->year, $r->{$k}->month, $r->{$k}->day)),
$r->{$k}->hour < 10 ? '0' . $r->{$k}->hour : $r->{$k}->hour,
$r->{$k}->min < 10 ? '0' . $r->{$k}->min : $r->{$k}->min
// {{{ +-- public (object) moonstatus ($v = null)
* 양력일에 대한 음력월 합삭/망 데이터 구하기
* {@example Lunar/tests/sample.php 311 56}
* @return stdClass 합삭/망 object
* [new] => stdClass Object // 합삭 (New Moon) 데이터
* [hyear] => AD 2013 // 합삭 AD/BC 형식 연도
* [year] => 2013 // 합삭 연도
* [julian] => 2456481.8020833 // Julian date (UTC)
* [full] => stdClass Object // 망 (Full Moon) 데이터
* [hyear] => AD 2013 // 망 AD/BC 형식 연도
* [julian] => 2456496.2493056 // Julian date (UTC)
* - unixstmap (1970년 12월 15일 이후부터 가능)
* - 1582년 10월 15일 이전의 날자는 율리우스력의 날자로 취급함.
list ($y, $m, $d) = $this->toargs ($v);
list ($y, $m, $d) = $this->fix_calendar ($y, $m, $d);
$y1, $mo1, $d1, $h1, $mi1,
$ym, $mom, $dm, $hm, $mim,
$j_new = $this->to_utc_julian (
$this->regdate (array ($y1, $mo1, $d1)),
$h1 < 10 ? '0' . $h1 : $h1,
$mi1 < 10 ? '0' . $mi1 : $mi1
// 1852-10-15 이전이면 julian으로 변경
$r = $this->gregorian2julian (array ($y1, $mo1, $d1));
$j_full = $this->to_utc_julian (
$this->regdate (array ($ym, $mom, $dm)),
$hm < 10 ? '0' . $hm : $hm,
$mim < 10 ? '0' . $mim : $mim
// 1852-10-15 이전이면 julian으로 변경
$r = $this->gregorian2julian (array ($ym, $mom, $dm));
'new' => (object) array (
'full' => (object) array (
// {{{ +-- public (string) ganji_ref ($no, $mode = false)
* dayfortune method의 ganji index 반환값을 이용하여, ganji
* {@example Lunar/tests/sample.php 163 56}
* @param int ganji index number
* @param bool 출력 모드 (false => 한글, true => 한자)
public function ganji_ref ($no, $mode = false) {
$m = $mode ? 'hganji' : 'ganji';
* vim: set filetype=php noet sw=4 ts=4 fdm=marker:
* vim600: noet sw=4 ts=4 fdm=marker
* vim<600: noet sw=4 ts=4
|