oops-Lunar
[ class tree: oops-Lunar ] [ index: oops-Lunar ] [ all elements ]

Source for file Lunar_API.php

Documentation is available at Lunar_API.php

  1. <?php
  2. /**
  3.  * Project: Lunar_API :: 양력/음력 변환 코어 클래스<br>
  4.  * File:    Lunar_API.php
  5.  *
  6.  * 이 패키지는 양력/음력간의 변환을 제공하는 API로, 고영창님의 '진짜만세력'
  7.  * 0.92(Perl version)와 0.93(Pascal version)버전을 PHP로 포팅한 것이다.
  8.  *
  9.  * 이 변환 API의 유효기간은 다음과 같다.
  10.  *
  11.  * <pre>
  12.  *   * 32bit
  13.  *     + -2087-02-09(음력 -2087-01-01) ~ 6078-01-29(음 6077-12-29)
  14.  *     + -2087-07-05(음력 -2087-05-29) 이전은 계산이 무지 느려짐..
  15.  *
  16.  *   * 64bit
  17.  *     + -4712-02-08 ~ 9999-12-31
  18.  *     + -9999-01-01 ~ 9999-12-31
  19.  *     + 64bit 계산이 가능한 시점까지 가능할 듯..
  20.  *
  21.  * </pre>
  22.  *
  23.  * @category    Calendar
  24.  * @package     oops\Lunar
  25.  * @subpackage    Lunar Core API
  26.  * @author      JoungKyun.Kim <http://oops.org>
  27.  * @copyright   (c) 2024, OOPS.org
  28.  * @license     고영창 (http://afnmp3.homeip.net/~kohyc/calendar/index.cgi)
  29.  * @link        https://github.com/OOPS-ORG-PHP/Lunar
  30.  * @filesource
  31.  */
  32.  
  33. /**
  34.  * Namespace oops
  35.  */
  36. namespace oops;
  37.  
  38. /**
  39.  * Lunar Core API
  40.  *
  41.  * 이 패키지는 양력/음력간의 변환을 제공하는 API로, 고영창님의 '진짜만세력'
  42.  * 0.92(Perl version)와 0.93(Pascal version)버전을 PHP로 포팅한 것이다.
  43.  *
  44.  * 이 변환 API의 유효기간은 다음과 같다.
  45.  *
  46.  * <pre>
  47.  *   * 32bit
  48.  *     + -2087-02-09(음력 -2087-01-01) ~ 6078-01-29(음 6077-12-29)
  49.  *     + -2087-07-05(음력 -2087-05-29) 이전은 계산이 무지 느려짐..
  50.  *
  51.  *   * 64bit
  52.  *     + -4712-02-08 ~ 9999-12-31
  53.  *     + -9999-01-01 ~ 9999-12-31
  54.  *     + 64bit 계산이 가능한 시점까지 가능할 듯..
  55.  *
  56.  * </pre>
  57.  *
  58.  * @package     oops\Lunar
  59.  * @subpackage    Lunar Core API
  60.  * @author      JoungKyun.Kim <http://oops.org>
  61.  * @copyright   (c) 2024, OOPS.org
  62.  * @license     고영창 (http://afnmp3.homeip.net/~kohyc/calendar/index.cgi)
  63.  * @filesource
  64.  */
  65. Class Lunar_API {
  66.     // {{{ +-- protected prpperties
  67.     /**#@+
  68.      * @access protected
  69.      */
  70.     /**
  71.      * @var array 
  72.      */
  73.     protected $month = array (
  74.         021355428436449886335108366130578152958,
  75.         175471198077220728243370265955288432310767,
  76.         332928354903376685398290419736441060462295,
  77.         483493504693525949
  78.     );
  79.  
  80.     /**
  81.      * 십간(十干) 데이터
  82.      * @var array 
  83.      */
  84.     protected $gan = array ('갑''을''병''정''무''기''경''신''임''계');
  85.     /**
  86.      * 십간(十干) 한자 데이터
  87.      * @var array 
  88.      */
  89.     protected $hgan = array ('甲''乙''丙''丁''戊''己''庚''辛''壬''癸');
  90.     /**
  91.      * 십이지(十二支) 데이터
  92.      * @var array 
  93.      */
  94.     protected $ji = array ('자''축''인''묘''진''사''오''미''신''유''술''해');
  95.     /**
  96.      * 십이지(十二支) 한자 데이터
  97.      * @var array 
  98.      */
  99.     protected $hji = array ('子''丑''寅''卯''辰''巳''午''未''申''酉''戌''亥');
  100.     /**
  101.      * 띠 데이터
  102.      * @var array 
  103.      */
  104.     protected $ddi = array ('쥐''소''호랑이''토끼''용''뱀''말''양''원숭이''닭''개''돼지');
  105.  
  106.     /**#@+
  107.      * 병자년 경인월 신미일 기해시 입춘 데이터
  108.      * @var integer
  109.      */
  110.     protected $unityear  = 1996;
  111.     protected $unitmonth = 2;
  112.     protected $unitday   = 4;
  113.     protected $unithour  = 22;
  114.     protected $unitmin   = 8;
  115.     protected $unitsec   = 0;
  116.     /**#@-*/
  117.  
  118.     /**#@+
  119.      * 병자년 데이터
  120.      * @var integer
  121.      */
  122.     protected $uygan = 2;
  123.     protected $uyji  = 0;
  124.     protected $uysu  = 12;
  125.     /**#@-*/
  126.  
  127.     /**#@+
  128.      * 경인년 데이터
  129.      * @var integer
  130.      */
  131.     protected $umgan = 6;
  132.     protected $umji  = 2;
  133.     protected $umsu  = 26;
  134.     /**#@-*/
  135.  
  136.     /**#@+
  137.      * 신미일 데이터
  138.      * @var integer
  139.      */
  140.     protected $udgan = 7;
  141.     protected $udji  = 7;
  142.     protected $udsu  = 7;
  143.     /**#@-*/
  144.  
  145.     /**#@+
  146.      * 기해시 데이터
  147.      * @var integer
  148.      */
  149.     protected $uhgan = 5;
  150.     protected $uhji  = 11;
  151.     protected $uhsu  = 35;
  152.     /**#@-*/
  153.  
  154.     /**#@+
  155.      * 정월 초하루 합삭 시간
  156.      * @var integer
  157.      */
  158.     protected $unitmyear  = 1996;
  159.     protected $unitmmonth = 2;
  160.     protected $unitmday   = 19;
  161.     protected $unitmhour  = 8;
  162.     protected $unitmmin   = 30;
  163.     protected $unitmsec   = 0;
  164.     protected $moonlength = 42524;
  165.     /**#@-*/
  166.     /**#@-*/
  167.     // }}}
  168.  
  169.     // {{{ +-- public prpperties
  170.     /**#@+
  171.      * @access public
  172.      */
  173.     /**
  174.      * 절기 데이터
  175.      * @var array 
  176.      */
  177.     protected $month_st = array (
  178.         '입춘''우수''경칩''춘분''청명''곡우',
  179.         '입하''소만''망종''하지''소서''대서',
  180.         '입추''처서''백로''추분''한로''상강',
  181.         '입동''소설''대설''동지''소한''대한',
  182.         '입춘'
  183.     );
  184.  
  185.     /**
  186.      * 절기(한자) 데이터
  187.      * @var array 
  188.      */
  189.     protected $hmonth_st = array (
  190.         '立春''雨水''驚蟄''春分''淸明''穀雨',
  191.         '立夏''小滿''芒種''夏至''小暑''大暑',
  192.         '立秋''處暑''白露''秋分''寒露''霜降',
  193.         '立冬''小雪''大雪''冬至''小寒''大寒',
  194.         '立春'
  195.     );
  196.  
  197.     /**
  198.      * 60간지 데이터
  199.      * @var array 
  200.      */
  201.     protected $ganji = array (
  202.         '갑자''을축''병인''정묘''무진''기사''경오''신미''임신''계유''갑술''을해',
  203.         '병자''정축''무인''기묘''경진''신사''임오''계미''갑신''을유''병술''정해',
  204.         '무자''기축''경인''신묘''임진''계사''갑오''을미''병신''정유''무술''기해',
  205.         '경자''신축''임인''계묘''갑진''을사''병오''정미''무신''기유''경술''신해',
  206.         '임자''계축''갑인''을묘''병진''정사''무오''기미''경신''신유''임술''계해'
  207.     );
  208.     /**
  209.      * 60간지 한자 데이터
  210.      * @var array 
  211.      */
  212.     protected $hganji = array (
  213.         '甲子','乙丑','丙寅','丁卯','戊辰','己巳','庚午','辛未','壬申','癸酉','甲戌','乙亥',
  214.         '丙子','丁丑','戊寅','己卯','庚辰','辛巳','壬午','癸未','甲申','乙酉','丙戌','丁亥',
  215.         '戊子','己丑','庚寅','辛卯','壬辰','癸巳','甲午','乙未','丙申','丁酉','戊戌','己亥',
  216.         '庚子','辛丑','壬寅','癸卯','甲辰','乙巳','丙午','丁未','戊申','己酉','庚戌','辛亥',
  217.         '壬子','癸丑','甲寅','乙卯','丙辰','丁巳','戊午','己未','庚申','辛酉','壬戌','癸亥'
  218.     );
  219.  
  220.     /**
  221.      * 요일 데이터
  222.      * @var array 
  223.      */
  224.     protected $week = array ('일','월','화','수','목','금','토');
  225.     /**
  226.      * 요일 한자 데이터
  227.      * @var array 
  228.      */
  229.     protected $hweek = array ('日','月','火','水','木','金','土');
  230.     /**
  231.      * 28일 데이터
  232.      * @var array 
  233.      */
  234.     protected $s28days = array (
  235.         '角','亢','氐','房','心','尾','箕',
  236.         '斗','牛','女','虛','危','室','壁',
  237.         '奎','婁','胃','昴','畢','觜','參',
  238.         '井','鬼','柳','星','張','翼','軫'
  239.     );
  240.     protected $s28days_hangul = array (
  241.         '각''항''저''방''심''미''기',
  242.         '두''우''녀''허''위''실''벽',
  243.         '규''수''위''묘''필''자''삼',
  244.         '정''귀''류''성''장''익''진'
  245.     );
  246.     /**#@-*/
  247.     // }}}
  248.  
  249.     // {{{ +-- protected (int) div ($a, $b)
  250.     /**
  251.      * 정수 몫을 반환
  252.      *
  253.      * @access protected
  254.      * @return int 
  255.      * @param int 
  256.      * @param int 
  257.      */
  258.     protected function div ($a$b{
  259.         return (int) ($a $b);
  260.     }
  261.     // }}}
  262.  
  263.     // {{{ +-- protected (int) disptimeday ($year, $month, $day)
  264.     /**
  265.      * year의 1월 1일부터 해당 일자까지의 날자수
  266.      *
  267.      * @access public
  268.      * @return int 날자수
  269.      * @param  int 
  270.      * @param  int 
  271.      * @param  int 
  272.      */
  273.     protected function disptimeday ($year$month$day{
  274.         $e $i 0;
  275.  
  276.         for $i=1$i<$month$i++ {
  277.             $e += 31;
  278.             if $i == || $i == || $i == || $i == || $i == 11 )
  279.                 $e--;
  280.  
  281.             if $i == {
  282.                 $e -= 2;
  283.                 if ( ($year 4== $e++;
  284.                 if ( ($year 100== $e--;
  285.                 if ( ($year 400== $e++;
  286.                 if ( ($year 4000== $e--;
  287.             }
  288.         }
  289.         $e += $day;
  290.  
  291.         return $e;
  292.     }
  293.     // }}}
  294.  
  295.     // {{{ +-- protected (int) disp2days ($y1, $m1, $d1, $y2, $m2, $d2)
  296.     /**
  297.      * y1,m1,d1일부터 y2,m2,d2까지의 일수 계산
  298.      *
  299.      * @access protected
  300.      * @return int 날자수
  301.      * @param int from year
  302.      * @param int from month
  303.      * @param int from day
  304.      * @param int until year
  305.      * @param int until month
  306.      * @param int until day
  307.      */
  308.     protected function disp2days ($y1$m1$d1$y2$m2$d2{
  309.         $p1 $p2 $pn1 $pp1 $pp2 $pr $dis $ppp1 $ppp2 $k 0;
  310.  
  311.         if $y2 $y1 {
  312.             $p1  $this->disptimeday ($y1$m1$d1);
  313.             $p1n $this->disptimeday ($y11231);
  314.             $p2  $this->disptimeday ($y2$m2$d2);
  315.             $pp1 $y1;
  316.             $pp2 $y2;
  317.             $pr  = -1;
  318.         else {
  319.             $p1  $this->disptimeday ($y2$m2$d2);
  320.             $p1n $this->disptimeday ($y21231);
  321.             $p2  $this->disptimeday ($y1$m1$d1);
  322.             $pp1 $y2;
  323.             $pp2 $y1;
  324.             $pr  1;
  325.         }
  326.  
  327.         if $y2 == $y1 )
  328.             $dis $p2 $p1;
  329.         else {
  330.             $dis $p1n $p1;
  331.             $ppp1 $pp1 1;
  332.             $ppp2 $pp2 1;
  333.  
  334.             for $k $ppp1$k <= $ppp2$k++ {
  335.                 # 0.93 diff {{{
  336.                 if $k == -9000 && $ppp2 1990 {
  337.                     $dis += 4014377;
  338.                     $k 1991;
  339.                 else if $k == -8000 && $ppp2 1990 {
  340.                     $dis += 3649135;
  341.                     $k 1991;
  342.                 else if $k == -7000 && $ppp2 1990 {
  343.                     $dis += 3283893;
  344.                     $k 1991;
  345.                 else if $k == -6000 && $ppp2 1990 {
  346.                     $dis += 2918651;
  347.                     $k 1991;
  348.                 else if $k == -5000 && $ppp2 1990 {
  349.                     $dis += 2553408;
  350.                     $k 1991;
  351.                 else if $k == -4000 && $ppp2 1990 {
  352.                     $dis += 2188166;
  353.                     $k 1991;
  354.                 else if $k == -3000 && $ppp2 1990 {
  355.                     $dis += 1822924;
  356.                     $k 1991;
  357.                 # 0.93 diff }}}
  358.                 else if $k == -2000 && $ppp2 1990 {
  359.                     $dis += 1457682;
  360.                     $k 1991;
  361.                 else if $k == -1750 && $ppp2 1990 {
  362.                     $dis += 1366371;
  363.                     $k 1991;
  364.                 else if $k ==-1500 && $ppp2 1990 {
  365.                     $dis += 1275060;
  366.                     $k 1991;
  367.                 else if $k ==-1250 && $ppp2 1990 {
  368.                     $dis += 1183750;
  369.                     $k 1991;
  370.                 else if $k ==-1000 && $ppp2 1990 {
  371.                     $dis += 1092439;
  372.                     $k 1991;
  373.                 else if $k == -750 && $ppp2 1990 {
  374.                     $dis += 1001128;
  375.                     $k 1991;
  376.                 else if $k == -500 && $ppp2 1990 {
  377.                     $dis += 909818;
  378.                     $k 1991;
  379.                 else if $k == -250 && $ppp2 1990 {
  380.                     $dis += 818507;
  381.                     $k 1991;
  382.                 else if $k == && $ppp2 1990 {
  383.                     $dis += 727197;
  384.                     $k 1991;
  385.                 else if $k == 250 && $ppp2 1990 {
  386.                     $dis += 635887;
  387.                     $k 1991;
  388.                 else if $k == 500 && $ppp2 1990 {
  389.                     $dis += 544576;
  390.                     $k 1991;
  391.                 else if $k == 750 && $ppp2 1990 {
  392.                     $dis += 453266;
  393.                     $k 1991;
  394.                 else if $k == 1000 && $ppp2 1990 {
  395.                     $dis += 361955;
  396.                     $k 1991;
  397.                 else if $k == 1250 && $ppp2 1990 {
  398.                     $dis += 270644;
  399.                     $k 1991;
  400.                 else if $k == 1500 && $ppp2 1990 {
  401.                     $dis += 179334;
  402.                     $k 1991;
  403.                 else if $k == 1750 && $ppp2 1990 {
  404.                     $dis += 88023;
  405.                     $k 1991;
  406.                 }
  407.  
  408.                 $dis += $this->disptimeday ($k1231);
  409.             }
  410.  
  411.             $dis += $p2;
  412.             $dis *= $pr;
  413.         }
  414.  
  415.         return $dis;
  416.     }
  417.     // }}}
  418.  
  419.     // {{{ +-- protected (int) getminbytime ($uy, $umm, $ud, $uh, $umin, $y1, $mo1, $d1, $h1, $mm1)
  420.     /**
  421.      * uy,umm,ud,uh,umin과 y1,mo1,d1,h1,mm1사이의 시간(분)
  422.      *
  423.      * @access protected
  424.      * @return int 
  425.      * @param int 
  426.      * @param int 
  427.      * @param int 
  428.      * @param int 
  429.      * @param int 
  430.      * @param int 
  431.      * @param int 
  432.      * @param int 
  433.      * @param int 
  434.      * @param int 
  435.      */
  436.     function getminbytime ($uy$umm$ud$uh$umin$y1$mo1$d1$h1$mm1{
  437.         $t 0;
  438.  
  439.         $dispday $this->disp2days ($uy$umm$ud$y1$mo1$d1);
  440.         $t $dispday 24 60 ($uh $h160 ($umin $mm1);
  441.  
  442.         return $t;
  443.     }
  444.     // }}}
  445.  
  446.     // {{{ +-- protected (array) getdatebymin ($tmin, $uyear, $umonth, $uday, $uhour, $umin)
  447.     /**
  448.      * uyear,umonth,uday,uhour,umin으로부터 tmin(분)떨이진 시점의
  449.      * 년월일시분(태양력) 구하는 프로시져
  450.      *
  451.      * @access public
  452.      * @return array 
  453.      * @param int 
  454.      * @param int 
  455.      * @param int 
  456.      * @param int 
  457.      * @param int 
  458.      * @param int 
  459.      */
  460.     protected function getdatebymin ($tmin$uyear$umonth$uday$uhour$umin{
  461.         $y1 $mo1 $d1 $h1 $mi1 $t 0;
  462.         $y1 $uyear $this->div ($tmin525949);
  463.  
  464.         if $tmin {
  465.             $y1 += ;
  466.             do {
  467.                 $y1--;
  468.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y11100);
  469.             while $t $tmin );
  470.  
  471.             $mo1 13 ;
  472.             do {
  473.                 $mo1--;
  474.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y1$mo1100);
  475.             while $t $tmin );
  476.  
  477.             $d1 32;
  478.             do {
  479.                 $d1--;
  480.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y1$mo1$d100);
  481.             while $t $tmin );
  482.  
  483.             $h1 24 ;
  484.             do {
  485.                 $h1--;
  486.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y1$mo1$d1$h10);
  487.             while $t $tmin );
  488.  
  489.             $t $this->getminbytime $uyear$umonth$uday$uhour$umin$y1$mo1$d1$h10);
  490.             $mi1 =  $t $tmin;
  491.         else {
  492.             $y1 -= 2;
  493.             do {
  494.                 $y1++;
  495.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y11100);
  496.             while $t >= $tmin );
  497.  
  498.             $y1--;
  499.             $mo1 0;
  500.             do {
  501.                 $mo1++;
  502.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y1$mo1100);
  503.             while $t >= $tmin );
  504.  
  505.             $mo1--;
  506.             $d1 0;
  507.             do {
  508.                 $d1++;
  509.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y1$mo1$d100);
  510.             while $t >= $tmin );
  511.  
  512.             $d1--;
  513.             $h1 = -;
  514.             do {
  515.                 $h1++;
  516.                 $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y1$mo1$d1$h10);
  517.             while $t >= $tmin );
  518.  
  519.             $h1--;
  520.             $t $this->getminbytime ($uyear$umonth$uday$uhour$umin$y1$mo1$d1$h10);
  521.             $mi1 $t $tmin;
  522.         }
  523.  
  524.         return array ($y1$mo1$d1$h1$mi1);
  525.     }
  526.     // }}}
  527.  
  528.     // {{{ +-- protected (array) sydtoso24yd ($soloryear, $solormonth, $solorday, $solorhour, $solormin)
  529.     /**
  530.      * 그레고리력의 년월시일분으로 60년의 배수, 세차, 월건(태양력),
  531.      * 일진, 시주를 구함
  532.      *
  533.      * @access public
  534.      * @return array 
  535.      *
  536.      *    <pre>
  537.      *    Array
  538.      *    (
  539.      *        [0] => -17  // 60년의 배수
  540.      *        [1] => 29   // 60간지의 연도 배열 index
  541.      *        [2] => 55   // 60간지의 월 배열 index
  542.      *        [3] => 11   // 60간지의 일 배열 index
  543.      *        [4] => 20   // 60간지의 시 배열 index
  544.      *    )
  545.      *    </pre>
  546.      *
  547.      * @param int 
  548.      * @param int 
  549.      * @param int 
  550.      * @param int 
  551.      * @param int 
  552.      */
  553.     protected function sydtoso24yd ($soloryear$solormonth$solorday$solorhour$solormin{
  554.         $displ2min $this->getminbytime (
  555.             $this->unityear$this->unitmonth$this->unitday$this->unithour$this->unitmin,
  556.             $soloryear$solormonth$solorday$solorhour$solormin
  557.         );
  558.         $displ2day $this->disp2days (
  559.             $this->unityear$this->unitmonth$this->unitday$soloryear,
  560.             $solormonth$solorday
  561.         );
  562.  
  563.         // 무인년(1996)입춘시점부터 해당일시까지 경과년수
  564.         $so24 $this->div ($displ2min525949);
  565.  
  566.         if $displ2min >= )
  567.             $so24++;
  568.  
  569.         // 년주 구하기
  570.         $so24year ($so24 60* -1;
  571.         $so24year += 12;
  572.         if $so24year )
  573.             $so24year += 60;
  574.         else if $so24year 59 )
  575.             $so24year -= 60;
  576.  
  577.         $monthmin100 $displ2min 525949;
  578.         $monthmin100 525949 $monthmin100;
  579.  
  580.         if $monthmin100 )
  581.             $monthmin100 += 525949;
  582.         else if $monthmin100 >= 525949 )
  583.             $monthmin100 -= 525949;
  584.  
  585.         for $i=0$i<=11$i++ {
  586.             $j $i 2;
  587.             if ( ($this->month[$j<= $monthmin100&& ($monthmin100 $this->month[$j+2]))
  588.                 $so24month $i;
  589.         }
  590.  
  591.         // 월주 구하기
  592.         $i $so24month;
  593.         $t $so24year 10 ;
  594.         $t %= ;
  595.         $t $t 12 $i;
  596.         $so24month $t ;
  597.         if $so24month 59 )
  598.             $so24month -= 60;
  599.  
  600.         // 일주 구하기
  601.         $so24day $displ2day 60;
  602.         $so24day *= -1;
  603.         $so24day += 7;
  604.         if $so24day )
  605.             $so24day += 60;
  606.         else if $so24day 59 )
  607.             $so24day -= 60;
  608.  
  609.         if ( ($solorhour == || $solorhour == 1&& $solormin 30 )
  610.             $i 0;
  611.  
  612.         else if ( ($solorhour == && $solormin >= 30|| $solorhour == 2
  613.             || ($solorhour == && $solormin 30) )
  614.             $i 1;
  615.  
  616.         else if ( ($solorhour == && $solormin >= 30|| $solorhour == 4
  617.             || ($solorhour == && $solormin 30) )
  618.             $i 2;
  619.  
  620.         else if ( ($solorhour == && $solormin >= 30|| $solorhour == 6
  621.             || ($solorhour == && $solormin 30) )
  622.             $i 3;
  623.  
  624.         else if ( ($solorhour == && $solormin >= 30|| $solorhour == 8
  625.             || ($solorhour == && $solormin 30) )
  626.             $i 4;
  627.  
  628.         else if ( ($solorhour == && $solormin >= 30|| $solorhour == 10
  629.             || ($solorhour == 11 && $solormin 30) )
  630.             $i 5;
  631.  
  632.         else if ( ($solorhour == 11 && $solormin >= 30|| $solorhour == 12
  633.             || ($solorhour == 13 && $solormin 30) )
  634.             $i 6;
  635.  
  636.         else if ( ($solorhour == 13 && $solormin >= 30|| $solorhour == 14
  637.             || ($solorhour == 15 && $solormin 30) )
  638.             $i 7;
  639.  
  640.         else if ( ($solorhour == 15 && $solormin >= 30|| $solorhour == 16
  641.             || ($solorhour == 17 && $solormin 30) )
  642.             $i 8;
  643.  
  644.         else if ( ($solorhour == 17 && $solormin >= 30|| $solorhour == 18
  645.             || ($solorhour == 19 && $solormin 30) )
  646.             $i 9;
  647.  
  648.         else if ( ($solorhour == 19 && $solormin >= 30|| $solorhour == 20
  649.             || ($solorhour == 21 && $solormin 30) )
  650.             $i 10;
  651.  
  652.         else if ( ($solorhour == 21 && $solormin >= 30|| $solorhour == 22
  653.             || ($solorhour == 23 && $solormin 30) )
  654.             $i 11;
  655.  
  656.         else if $solorhour == 23 && $solormin >= 30 {
  657.             $so24day++;
  658.             if $so24day == 60 )
  659.                 $so24day 0;
  660.             $i 0;
  661.         }
  662.  
  663.         $t $so24day 10;
  664.         $t %= 5;
  665.         $t $t 12 $i;
  666.         $so24hour $t;
  667.  
  668.         return array ($so24$so24year$so24month$so24day$so24hour);
  669.     }
  670.     // }}}
  671.  
  672.     // {{{ +-- protected (array) solortoso24 ($soloryear, $solormonth, $solorday, $solorhour, $solormin)
  673.     /**
  674.      * 절기 시간 구하기
  675.      *
  676.      * 그레고리력의 년월일시분이 들어있는 절기의 이름번호,
  677.      * 년월일시분을 얻음
  678.      *
  679.      * @access protected
  680.      * @return array 
  681.      * @param int 
  682.      * @param int 
  683.      * @param int 
  684.      * @param int 
  685.      * @param int 
  686.      */
  687.     protected function solortoso24 ($soloryear$solormonth$solorday$solorhour$solormin{
  688.         list ($so24$so24year$so24month$so24day$so24hour=
  689.             $this->sydtoso24yd ($soloryear$solormonth$solorday$solorhour$solormin);
  690.  
  691.         $displ2min $this->getminbytime (
  692.             $this->unityear$this->unitmonth$this->unitday$this->unithour$this->unitmin,
  693.             $soloryear$solormonth$solorday$solorhour$solormin
  694.         );
  695.  
  696.         # 이거 고민좀 해 봐야 할 듯!!
  697.         # perl 과 php 의 음수의 나머지 결과값이 다르다! --;
  698.         #$monthmin100 = $displ2min % 525949;
  699.         #$monthmin100 = 525949 - $monthmin100;
  700.         $monthmin100 ($displ2min 525949* -1;
  701.  
  702.         if $monthmin100 )
  703.             $monthmin100 += 525949;
  704.         else if $monthmin100 >= 525949 )
  705.             $monthmin100 -= 525949;
  706.  
  707.         $i $so24month 12 2;
  708.         if $i == -$i 10;
  709.         else if $i == -$i 11;
  710.  
  711.         $inginame  $i ;
  712.         $midname   $i 1;
  713.         $outginame $i 2;
  714.  
  715.         $j $i 2;
  716.         $tmin $displ2min ($monthmin100 $this->month[$j]);
  717.  
  718.         list ($y1$mo1$d1$h1$mi1=
  719.             $this->getdatebymin ($tmin$this->unityear$this->unitmonth$this->unitday$this->unithour$this->unitmin);
  720.  
  721.         $ingiyear  $y1;
  722.         $ingimonth $mo1;
  723.         $ingiday   $d1;
  724.         $ingihour  $h1;
  725.         $ingimin   $mi1;
  726.  
  727.         $tmin $displ2min ($monthmin100 $this->month[$j+1]);
  728.         list ($y1$mo1$d1$h1$mi1=
  729.             $this->getdatebymin ($tmin$this->unityear$this->unitmonth$this->unitday$this->unithour$this->unitmin);
  730.  
  731.         $midyear  $y1;
  732.         $midmonth $mo1;
  733.         $midday   $d1;
  734.         $midhour  $h1;
  735.         $midmin   $mi1;
  736.  
  737.         $tmin $displ2min ($monthmin100 $this->month[$j+2]);
  738.         list ($y1$mo1$d1$h1$mi1=
  739.             $this->getdatebymin ($tmin$this->unityear$this->unitmonth$this->unitday$this->unithour$this->unitmin);
  740.  
  741.         $outgiyear  $y1;
  742.         $outgimonth $mo1;
  743.         $outgiday   $d1;
  744.         $outgihour  $h1;
  745.         $outgimin   $mi1;
  746.  
  747.         return array (
  748.             $inginame$ingiyear$ingimonth$ingiday$ingihour$ingimin,
  749.             $midname$midyear$midmonth$midday$midhour$midmin,
  750.             $outginame$outgiyear$outgimonth$outgiday$outgihour$outgimin
  751.         );
  752.     }
  753.     // }}}
  754.  
  755.     // {{{ +-- protected (int) degreelow ($d)
  756.     /**
  757.      * 미지의 각도를 0~360도 이내로 만듬
  758.      *
  759.      * @access protected
  760.      * @return int 
  761.      * @param int 
  762.      */
  763.     protected function degreelow ($d{
  764.         $di $d;
  765.         $i $this->div ((int) $d360);
  766.         $di $d ($i 360);
  767.  
  768.         while $di >= 360 || $di {
  769.             if $di )
  770.                 $di -= 360;
  771.             else
  772.                 $di += 360;
  773.         }
  774.  
  775.         return $di;
  776.     }
  777.     // }}}
  778.  
  779.     // {{{ +-- protected (int) moonsundegree ($day)
  780.     /**
  781.      * 태양황력과 달황경의 차이 (1996 기준)
  782.      *
  783.      * @access protected
  784.      * @return int 
  785.      * @param int 
  786.      */
  787.     protected function moonsundegree ($day{
  788.         $sl = (float) ($day 0.98564736 278.956807);                // 평균 황경
  789.         $smin 282.869498 0.00004708 $day;                        // 근일점 황경
  790.         $sminangle 3.14159265358979 ($sl $smin180;           // 근점이각
  791.         $sd 1.919 sin ($sminangle0.02 sin ($sminangle);  // 황경차
  792.         $sreal $this->degreelow ($sl $sd);                         // 진황경
  793.  
  794.         $ml 27.836584 13.17639648 $day;                          // 평균 황경
  795.         $mmin 280.425774 0.11140356 $day;                        // 근지점 황경
  796.         $mminangle 3.14159265358979 ($ml $mmin180;           // 근점이각
  797.         $msangle 202.489407 0.05295377 $day;                     // 교점황경
  798.         $msdangle 3.14159265358979 ($ml $msangle180;
  799.         $md 5.06889 sin ($mminangle)
  800.             + 0.146111 sin ($mminangle)
  801.             + 0.01 sin ($mminangle)
  802.             - 0.238056 sin ($sminangle)
  803.             - 0.087778 sin ($mminangle $sminangle)
  804.             + 0.048889 sin ($mminangle $sminangle)
  805.             - 0.129722 sin ($msdangle)
  806.             - 0.011111 sin ($msdangle $mminangle)
  807.             - 0.012778 sin ($msdangle $mminangle);             // 황경차
  808.         $mreal $this->degreelow ($ml $md);                         // 진황경
  809.         $re $this->degreelow ($mreal $sreal);
  810.  
  811.         return $re;
  812.     }
  813.     // }}}
  814.  
  815.     // {{{ +-- protected (array) getlunarfirst ($syear, $smonth, $sday)
  816.     /**
  817.      * 그레고리력 년월일이 들어있는 태음월의 시작합삭일지, 망일시,
  818.      * 끝합삭일시를 구함
  819.      *
  820.      * @access protected
  821.      * @return array 
  822.      *
  823.      *    <pre>
  824.      *    Array
  825.      *    (
  826.      *        [0] => 2013    // 시작 합삭 년도
  827.      *        [1] => 7       // 시작 합삭 월
  828.      *        [2] => 8       // 시작 합삭 일
  829.      *        [3] => 16      // 시작 합삭 시
  830.      *        [4] => 15      // 시작 합삭 분
  831.      *        [5] => 2013    // 망 연도
  832.      *        [6] => 7       // 망 월
  833.      *        [7] => 23      // 망 일
  834.      *        [8] => 2       // 망 시
  835.      *        [9] => 59      // 망 분
  836.      *        [10] => 2013   // 끝 합삭 년도
  837.      *        [11] => 8      // 끝 합삭 월
  838.      *        [12] => 7      // 끝 합삭 일
  839.      *        [13] => 6      // 끝 합삭 시
  840.      *        [14] => 50     // 끝 합삭 분
  841.      *    )
  842.      *    </pre>
  843.      *
  844.      * @param int 
  845.      * @param int 
  846.      * @param int 
  847.      */
  848.     protected function getlunarfirst ($syear$smonth$sday{
  849.         $dm  $this->disp2days ($syear$smonth$sday19951231);
  850.         $dem $this->moonsundegree ($dm);
  851.  
  852.         $d  $dm;
  853.         $de $dem;
  854.  
  855.         while $de 13.5 {
  856.             $d--;
  857.             $de $this->moonsundegree ($d);
  858.         }
  859.  
  860.         while $de {
  861.             $d -= 0.04166666666;
  862.             $de $this->moonsundegree ($d);
  863.         }
  864.  
  865.         while $de 359.99 {
  866.             $d -= 0.000694444;
  867.             $de $this->moonsundegree ($d);
  868.         }
  869.  
  870.         $d += 0.375;
  871.         $d *= 1440;
  872.         $i= (int) $d * -1;
  873.         list ($year$month$day$hour$min)$this->getdatebymin ($i1995123100);
  874.  
  875.         $d  $dm;
  876.         $de $dem;
  877.  
  878.         while $de 346.5 {
  879.             $d++;
  880.             $de $this->moonsundegree ($d);
  881.         }
  882.  
  883.         while $de 359 {
  884.             $d += 0.04166666666;
  885.             $de $this->moonsundegree ($d);
  886.         }
  887.  
  888.         while $de 0.01 {
  889.             $d += 0.000694444;
  890.             $de $this->moonsundegree ($d);
  891.         }
  892.  
  893.         $pd $d;
  894.         $d  += 0.375;
  895.         $d  *= 1440;
  896.         $i  = (int) $d * -1;
  897.         list ($year2$month2$day2$hour2$min2$this->getdatebymin ($i1995123100);
  898.  
  899.         if $smonth == $month2 && $sday == $day2 {
  900.             $year  $year2;
  901.             $month $month2;
  902.             $day   $day2;
  903.             $hour  $hour2;
  904.             $min   $min2;
  905.  
  906.             # {{{ for 0.93 diff
  907.             $d $pd 26;
  908.  
  909.             $de $this->moonsundegree ($d);
  910.             while $de 346.5 {
  911.                 $d++;
  912.                 $de $this->moonsundegree ($d);
  913.             }
  914.             # 위의 라인 부분이 pascal(0.93) 버전에서는 아래와 같이 처리 되어 있음.
  915.             # 함수 반환 값의 차이가 없는 것으로 보아 성능 개선 코드일까?
  916.             #$d = $pd;
  917.             #while ( $de < 347 ) {
  918.             #    $d++;
  919.             #    $de = $this->moonsundegree ($d);
  920.             #}
  921.             # 0.93 diff }}}
  922.  
  923.             while $de 359 {
  924.                 $d += 0.04166666666;
  925.                 $de $this->moonsundegree ($d);
  926.             }
  927.  
  928.             while $de 0.01 {
  929.                 $d += 0.000694444;
  930.                 $de $this->moonsundegree ($d);
  931.             }
  932.  
  933.             $d += 0.375;
  934.             $d *= 1440;
  935.             $i = (int) $d * -1;
  936.             list ($year2$month2$day2$hour2$min2$this->getdatebymin ($i1995123100);
  937.         }
  938.  
  939.         # 음력 초하루
  940.         $d $this->disp2days ($year$month$day19951231);
  941.         # 음력 12월
  942.         $d += 12;
  943.  
  944.         $de $this->moonsundegree ($d);
  945.         while $de 166.5 {
  946.             $d++;
  947.             $de $this->moonsundegree ($d);
  948.         }
  949.         while $de 179 {
  950.             $d += 0.04166666666;
  951.             $de $this->moonsundegree ($d);
  952.         }
  953.         while $de 179.999 {
  954.             $d += 0.000694444;
  955.             $de $this->moonsundegree ($d);
  956.         }
  957.  
  958.         $d += 0.375;
  959.         $d *= 1440;
  960.         $i = (int) $d * -1;
  961.         list ($year1$month1$day1$hour1$min1$this->getdatebymin ($i1995123100);
  962.  
  963.         return array (
  964.             $year$month$day$hour$min,
  965.             $year1$month1$day1$hour1$min1,
  966.             $year2$month2$day2$hour2$min2
  967.         );
  968.     }
  969.     // }}}
  970.  
  971.     // {{{ +-- protected (array) solartolunar ($solyear,$solmon,$solday)
  972.     /**
  973.      * 양력 날자를 음력 날자로 변환
  974.      *
  975.      * @access protected
  976.      * @return array 
  977.      *
  978.      *    <pre>
  979.      *    Array
  980.      *    (
  981.      *        [0] => 2013   // 음력 연도
  982.      *        [1] => 6      // 음력 월
  983.      *        [2] => 9      // 음력 일
  984.      *        [3] =>        // 음력 윤달 여부 (boolean)
  985.      *        [4] => 1      // 평달(false)/큰달(true) 여부 (boolean)
  986.      *    )
  987.      *    </pre>
  988.      *
  989.      * @param int 
  990.      * @param int 
  991.      * @param int 
  992.      */
  993.     protected function solartolunar ($solyear$solmon$solday{
  994.         list ($smoyear$smomonth$smoday$smohour$smomin,
  995.             $y0$mo0$d0$h0$mi0$y1$mo1$d1$h1$mi1)
  996.             = $this->getlunarfirst ($solyear$solmon$solday);
  997.  
  998.         $lday $this->disp2days ($solyear$solmon$solday$smoyear$smomonth$smoday1;
  999.  
  1000.         $i abs ($this->disp2days ($smoyear$smomonth$smoday$y1$mo1$d1));
  1001.         if $i == 30 )
  1002.             $largemonth 1# 대월
  1003.         if $i == 29 )
  1004.             $largemonth 0# 소월
  1005.  
  1006.         list ($inginame$ingiyear$ingimonth$ingiday$ingihour$ingimin,
  1007.             $midname1$midyear1$midmonth1$midday1$midhour1$midmin1,
  1008.             $outginame$outgiyear$outgimonth$outgiday$outgihour$outgimin)
  1009.             = $this->solortoso24 ($smoyear$smomonth$smoday$smohour$smomin);
  1010.  
  1011.         $midname2 $midname1 2;
  1012.         if $midname2 24 )
  1013.             $midname2 1;
  1014.         $s0 $this->month[$midname2$this->month[$midname1];
  1015.         if $s0 )
  1016.             $s0 += 525949;
  1017.         $s0 *= -1;
  1018.  
  1019.         list ($midyear2$midmonth2$midday2$midhour2$midmin2)
  1020.             = $this->getdatebymin ($s0$midyear1$midmonth1$midday1$midhour1$midmin1);
  1021.  
  1022.         if ( ($midmonth1 == $smomonth && $midday1 >= $smoday|| ($midmonth1 == $mo1 && $midday1 $d1) ) {
  1023.             $lmonth  ($midname1 11;
  1024.             $leap 0;
  1025.         else {
  1026.             if ( ($midmonth2 == $mo1 && $midday2<$d1|| ($midmonth2 == $smomonth && $midday2 >= $smoday) ) {
  1027.                 $lmonth   ($midname2 11;
  1028.                 $leap 0;
  1029.             else {
  1030.                 if (  $smomonth $midmonth2 && $midmonth2 $mo1 {
  1031.                     $lmonth   ($midname2 11;
  1032.                     $leap 0;
  1033.                 else {
  1034.                     $lmonth   ($midname1 11;
  1035.                     $leap 1;
  1036.                 }
  1037.             }
  1038.         }
  1039.  
  1040.  
  1041.         $lyear $smoyear;
  1042.         if $lmonth == 12 && $smomonth == )
  1043.             $lyear--;
  1044.  
  1045.         if ( ($lmonth == 11 && $leap == 1|| $lmonth == 12 || $lmonth {
  1046.             list ($midyear1$midmonth1$midday1$midhour1$midmin1)
  1047.                 = $this->getdatebymin (2880$smoyear$smomonth$smoday$smohour$smomin);
  1048.  
  1049.             list ($outgiyear$outgimonth$outgiday$lnp$lnp2)
  1050.                 = $this->solartolunar ($midyear1$midmonth1$midday1);
  1051.  
  1052.             $outgiday $lmonth 1;
  1053.             if $outgiday== )
  1054.                 $outgiday 12;
  1055.  
  1056.             if $outgiday == $outgimonth {
  1057.                 if $leap == )
  1058.                     $leap=0;
  1059.             else {
  1060.                 if $leap == {
  1061.                     if $lmonth != $outgimonth {
  1062.                         $lmonth--;
  1063.                         if $lmonth == 
  1064.                             $lyear--;
  1065.                             $lmonth 12;
  1066.                         }
  1067.                         $leap 0;
  1068.                     }
  1069.                 else {
  1070.                     if $lmonth == $outgimonth {
  1071.                         $leap 1;
  1072.                     else {  
  1073.                         $lmonth--;
  1074.                         if $lmonth == {
  1075.                             $lyear--;
  1076.                             $lmonth 12;
  1077.                         }
  1078.                     }
  1079.                 }
  1080.             }
  1081.  
  1082.         }
  1083.  
  1084.         return array ($lyear$lmonth$lday$leap true false$largemonth true false);
  1085.     }
  1086.     // }}}
  1087.  
  1088.     // {{{ +-- protected (array) lunartosolar ($lyear, $lmonth, $lday, $leap)
  1089.     /**
  1090.      * 음력 날자를 양력 날자로 변환
  1091.      *
  1092.      * @access protected
  1093.      * @return array 
  1094.      *
  1095.      *    <pre>
  1096.      *    Array
  1097.      *    (
  1098.      *        [0] => 2013   // 양력 연도
  1099.      *        [1] => 6      // 양력 월
  1100.      *        [2] => 9      // 양력 일
  1101.      *    )
  1102.      *    </pre>
  1103.      *
  1104.      * @param int  년
  1105.      * @param int  월
  1106.      * @param int  일
  1107.      * @param bool 음력 윤달 여부
  1108.      */
  1109.     protected function lunartosolar ($lyear$lmonth$lday$leap false{
  1110.         list ($inginame$ingiyear$ingimonth$ingiday$ingihour$ingimin,
  1111.             $midname$midyear$midmonth$midday$midhour$midmin,
  1112.             $outginame$outgiyear$outgimonth$outgiday$outgihour$outgimin)
  1113.             = $this->solortoso24 ($lyear,2,15,0,0);
  1114.  
  1115.         $midname $lmonth ;
  1116.         $tmin $this->month[$midname* -1;
  1117.         list ($midyear$midmonth$midday$midhour$midmin
  1118.             = $this->getdatebymin ($tmin$ingiyear$ingimonth$ingiday$ingihour$ingimin);
  1119.  
  1120.         list $outgiyear$outgimonth$outgiday$hour$min,
  1121.             $yearm$monthm1$daym$hourm$minm,
  1122.             $year1$month1$day1$hour1$min1 )
  1123.             = $this->getlunarfirst ($midyear$midmonth$midday);
  1124.  
  1125.         list ($lyear2$lmonth2$lday2$lnp$lnp2
  1126.             = $this->solartolunar ($outgiyear$outgimonth$outgiday);
  1127.  
  1128.         if $lyear2 == $lyear && $lmonth == $lmonth2 {
  1129.             // 평달, 윤달
  1130.             $tmin = -1440 $lday 10;
  1131.             list ($syear$smonth$sday$hour$min)
  1132.                 = $this->getdatebymin ($tmin$outgiyear$outgimonth$outgiday00);
  1133.  
  1134.  
  1135.             if $leap {
  1136.                 list ($lyear2$lmonth2$lday2$lnp$lnp2)
  1137.                     = $this->solartolunar ($year1$month1$day1);
  1138.                 if $lyear2==$lyear && $lmonth==$lmonth2 {
  1139.                     $tmin = -1440 $lday 10;
  1140.                     list ($syear$smonth$sday$hour$min)
  1141.                         = $this->getdatebymin ($tmin$year1$month1$day100);
  1142.                 }
  1143.             }
  1144.         else {
  1145.             // 중기가 두번든 달의 전후
  1146.             list ($lyear2$lmonth2$lday2$lnp$lnp2)
  1147.                 = $this->solartolunar ($year1$month1$day1);
  1148.             if $lyear2 == $lyear && $lmonth == $lmonth2 {
  1149.                 $tmin = -1440 $lday 10;
  1150.                 list ($syear$smonth$sday$hour$min)
  1151.                     = $this->getdatebymin ($tmin$year1$month1$day100);
  1152.             }
  1153.         }
  1154.  
  1155.         return array ($syear$smonth$sday);
  1156.     }
  1157.     // }}}
  1158.  
  1159.     // {{{ +-- protected (int) getweekday ($syear, $smonth, $sday)
  1160.     /**
  1161.      * 그레고리력 날자를 요일의 배열 번호로 변환
  1162.      *
  1163.      * @access protected
  1164.      * @return int 
  1165.      * @param int 
  1166.      * @param int 
  1167.      * @param int 
  1168.      */
  1169.     protected function getweekday ($syear$smonth$sday{
  1170.         $d $this->disp2days (
  1171.             $syear$smonth$sday,
  1172.             $this->unityear$this->unitmonth$this->unitday
  1173.         );
  1174.  
  1175.         $i $this->div ($d7);
  1176.         $d -= $i 7;
  1177.  
  1178.         while $d || $d {
  1179.             if ($d 6)
  1180.                 $d -= 7;
  1181.             else
  1182.                 $d += 7;
  1183.         }
  1184.  
  1185.         if $d )
  1186.             $d += 7;
  1187.  
  1188.         return $d;
  1189.     }
  1190.     // }}}
  1191.  
  1192.     // {{{ +-- protected (int) get28sday ($syear, $smonth, $sday)
  1193.     /**
  1194.      * 그레고리력의 날자에 대한 28수를 구함
  1195.      *
  1196.      * @access protected
  1197.      * @return int 
  1198.      * @param int 
  1199.      * @param int 
  1200.      * @param int 
  1201.      */
  1202.     protected function get28sday ($syear$smonth$sday{
  1203.         $d $this->disp2days (
  1204.             $syear$smonth$sday,
  1205.             $this->unityear$this->unitmonth$this->unitday
  1206.         );
  1207.  
  1208.         $i $this->div ($d28);
  1209.         $d -= $i 28;
  1210.  
  1211.         while $d 27 || $d {
  1212.             if ($d 27)
  1213.                 $d -= 28;
  1214.             else
  1215.                 $d += 28;
  1216.         }
  1217.  
  1218.         # {{{ for 0.93 diff
  1219.         # parscal(0.93) 버전에서는 이 2라인이 제거 되어 있음.
  1220.         # 실행의 값은 차이가 없는데, 성능 개선인가?
  1221.         if $d )
  1222.             $d += 7;
  1223.         # 0.93 diff }}}
  1224.  
  1225.         $d -= 11;
  1226.  
  1227.         if $d )
  1228.             $d += 28;
  1229.  
  1230.         return $d;
  1231.     }
  1232.     // }}}
  1233. }
  1234.  
  1235. /*
  1236.  * Local variables:
  1237.  * tab-width: 4
  1238.  * c-basic-offset: 4
  1239.  * End:
  1240.  * vim: set filetype=php noet sw=4 ts=4 fdm=marker:
  1241.  * vim600: noet sw=4 ts=4 fdm=marker
  1242.  * vim<600: noet sw=4 ts=4
  1243.  */
  1244. ?>

Documentation generated on Fri, 30 Aug 2024 06:10:52 +0900 by phpDocumentor 1.4.4