PHP 음력 그레고리력 변환
- /*
- 운남취징사범대학교 컴퓨터공학부 - 글: Yang Haixi
- 2009-9-3
- */
- class Lunar
- {
- private $_SMDay = array(1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); //정의 그레고리오력 월의 일수
- private $_LStart = 1950;//음력은 1950년에 시작됩니다.
- private $_LMDay = array(
- //차이: 첫 번째 날의 첫 번째 날 해당 연도의 음력 월부터 해당 연도의 양력 첫 번째 달의 1일까지의 일 수 1~12: 음력 월의 일수: 윤달이 있는 경우 기록; 해당 월의 보통일 수
- // 차이 1 2 3 4 5 6 7 8 9 10 11 12 도약
- array(47, 29,30,30,29,30,30,29,29, 30,29,30,29),
- 배열(36,30,29,30,30,29,30,29,30,29, 30,29,30),
- 배열(6,29, 30,29,30,59,29,30,30,29,30,29,30,29), //5월 29일 도약 5월 30일
- array(44,29,30,29,29,30,30 ,29,30,30,29,30,29),
- 배열(33,30,29,30,29,29,30 ,29,30,30,29,30,30),
- 배열 (23,29,30,59,29,29,30,29,30,29,30,30,30,29), // 3월 29일 도약 3월 30
- array(42,29,30,29, 30,29,29,30,29,30,29,30,30),
- 배열(30,30,29, 30,29,30,29,29,59,30,29,30,29, 30), //8월 30일 도약 8월 29
- array(48,30,30,30,29,30,29 ,29,30,29,30,29,30),
- array(38,29 ,30,30,29,30,29,30,29,30,29,30,29),
- 배열(27,30,29,30,29,30,59,30,29,30,29 ,30,29,30), //6월 30일 도약 6월 29일
- array(45,30,29, 30,29,30,29,30,30,29,30,29,30),
- 배열(35,29,30,29,29,30,29,30,30,29,30,30, 29),
- 배열(24,30,29,30,58,30,29,30, 29,30,30,30,29,29), //4월 29일 도약 4월 29
- 배열 (43,30,29,30,29,29,30,29,30,29,30,30,30 ),
- 배열(32,29,30,29,30,29,29,30,29 ,29,30,30,29),
- 배열(20,30,30,59,30,29 ,29,30,29,29,30,30,29,30), //3월 30일 도약 3월 29일
- array(39,30,30,29,30,30,29,29,30,29, 30,29,30),
- array(29,29,30,29,30, 30,29,59,30,29,30,29,30,30), //7월 30일 도약 7월 29일
- 배열(47,29,30,29,30,29,30,30,29 ,30,29,30,29),
- 배열(36,30,29,29,30,29,30,30 ,29,30,30,29,30),
- array(26,29 ,30,29,29,59,30,29,30,30,30,29,30,30), //5월 30일 도약 5월 29일
- array(45,29,30,29,29, 30,29,30,29,30,30,29,30),
- array(33,30,29,30,29, 29,30,29,29,30,30,29,30),
- 배열(22,30,30,29,59,29,30,29,29,30,30,29,30,30) , //4월 30일 도약 4월 29일
- array(41,30 ,30,29,30,29,29,30,29,29,30,29,30),
- array(30,30,30 ,29,30,29,30,29,59,29,30 ,29,30,30), //8월 30일 도약 8월 29
- array(48,30,29,30,30,29,30, 29,30,29,30,29,29),
- 배열(37,30,29,30,30,29,30,30,29,30,29,30,29),
- 배열( 27,30,29,29,30,29,60, 29,30,30,29,30,29,30), //6월 30일 도약 6월 30
- 배열(46,30,29,29,30 ,29,30,29,30,30,29,30,30),
- 배열(35,29,30,29,29,30,29,29,30,30,29,30,30),
- array(24,30,29,30 ,58,30,29,29,30,29,30,30,30,29), //4월 29일 도약 4월 29일
- array(43,30, 29,30,29,29,30, 29,29,30,29,30,30),
- 배열(32,30,29,30,30,29,29,30,29,29,59, 30,30,30), //10월 30일 도약 10월 29일
- array(50,29,30,30,29,30,29,30,29,29,30,29,30),
- 배열(39,29,30,30,29,30,30,29,30,29,30,29,29),
- 배열(28,30,29,30,29,30,59,30, 30,29,30,29,29 ,30), //6월 30일 도약 6월 29
- 배열(47,30,29,30,29,30,29,30,30,29,30,30,29 ),
- 배열( 36,30,29,29,30,29,30,29,30,29,30,30,30),
- 배열(26,29,30,29,29,59 ,29,30,29, 30,30,30,30,30), //5월 30일 도약 5월 29일
- array(45,29,30,29,29,30,29,29,30,29, 30,30,30 ),
- 배열(34,29,30,30,29,29,30,29,29,30,29,30,30),
- 배열(22,29,30, 59,30,29 ,30,29,29,30,29,30,29,30), //3월 30일 도약 3월 29일
- array(40,30,30,30,29,30,29,30 ,29, 29,30,29,30),
- array(30,29,30,30,29,30,29,30,59,29,30,29,30,30), //8월 30일 , 윤팔 29번째 달
- array(49,29,30,29,30,30,29,30,29,30,30,29,29),
- array(37,30,29,30, 29,30 ,29,30,30,29,30,30,29),
- 배열(27,30,29,29,30,58,30,30,29,30,30,29,30, 29), //5월 29일 도약 5월 29일
- array(46,30,29,29,30,29,29,30,29,30,30,30,29),
- array(35,30 , 30,29,29,30,29,29,30,29,30,30,29),
- 배열(23,30,30,29,59,30,29,29,30,29,30 , 29,30,30), //4월 30일 도약 4월 29
- array(42,30,30,29,30,29,30,29,29,30,29,30,29),
- 배열(31,30,30,29,30,30,29,30,29,29,30,29,30),
- 배열(21,29,59,30,30,29,30,29 , 30,29,30,29,30,30), //2월 30일 도약 2월 29
- array(39,29,30,29,30,29,30,30,29,30,29, 30,29 ),
- array(28,30,29,30,29,30,29,59,30,30,29,30,30,30), //7월 30일 도약 7월 29
- array(48, 29,29,30,29,29,30,29,30,30,30,29,30),
- 배열(37,30,29,29,30,29,29,30,29,30, 30,29,30),
- array(25,30,30,29,29,59,29,30,29,30,29,30,30,30), //5월 30일 도약 5월 29일
- 배열(44,30,29,30,29,30,29,29,30,29,30,29,30),
- 배열(33,30,29,30, 30,29,30,29 ,29,30,29,30,29),
- array(22,30,29,30,59,30,29,30,29,30,29,30,29, 30), //4월 30일 도약 4월 29일
- array(40,30,29,30,29,30,30,29,30,29,30,29,30),
- array(30 ,29,30,29,30, 29,30,29,30,59,30,29,30,30), //9월 30일 도약 9월 29일
- 배열(49,29,30,29,29,30,29,30,30,30,29,30,29),
- 배열(38,30,29,30,29,29,30,29, 30,30,29,30,30),
- array(27,29,30,29,30,29,59,29,30,29,30,30,30,29), //6월 29일 도약 6월 30일
- 배열(46,29,30,29,30,29,29,30,29,30,29,30,30),
- 배열(35,30,29,30,29 ,30 ,29,29,30,29,29,30,30),
- 배열(24,29,30,30,59,30,29,29,30,29,30,29,30,30), //4월 30일 도약 4월 29일
- array(42,29,30,30,29,30,29,30,29,30,29,30,29),
- array(31, 30,29, 30,29,30,30,29,30,29,30,29,30),
- 배열(21,29,59,29,30,30,29,30,30,29, 30,29, 30,30), //2월 30일 도약 2월 29일
- array(40,29,30,29,29,30,29,30,30,29,30,30,29),
- array(28 ,30,29,30,29,29,59,30,29,30,30,30,29,30), //6월 30일 도약 6월 29일
- array(47, 30,29,30,29, 29,30,29,29,30,30,30,29),
- 배열(36,30,30,29,30,29,29,30,29,29, 30,30,29),
- array(25,30,30,30,29,59,29,30,29,29,30,30,29,30), //5월 30일 도약 5월 29일
- array(43,30,30 ,29,30,29,30,29,30,29,29,30,30),
- 배열(33,29,30,29,30,30,29 ,30,29,30,29,30 ,29),
- array(22,29,30,59,30,29,30,30,29,30,29,30,29,30), // 3월 30일 도약 3월 29일
- array( 41,30,29,29,30,29,30,30,29,30,30,29,30),
- 배열(30,29,30, 29,29,30,29,30,29, 30,30,59,30,30), //11월 30일 도약 11월 29
- array(49,29,30,29,29,30 ,29,30,29,30,30,29,30),
- 배열(38,30,29,30,29,29,30,29,29,30,30,29,30),
- 배열(27,30,30,29,30,29,59 ,29,29,30,29,30,30,29), //6월 29일 도약 6월 30
- array(45,30, 30,29,30,29,29,30,29,29,30, 29,30),
- 배열(34,30,30,29,30,29,30,29,30,29,29, 30,29),
- 배열(23,30,30,29, 30,59,30,29,30,29,30,29,29,30), //5월 30일 도약 5월 29
- array(42,30,29,30,30,29,30,29,30 ,30,29,30,29),
- 배열(31,29,30,29,30,29,30,30 ,29,30,30,29,30),
- 배열(21,29 ,59,29,30,29,30,29,30,30,29,30,30,30), //2월 30일 도약 2월 29일
- array(40,29,30,29,29,30, 29,29,30,30,29,30,30),
- 배열(29,30,29,30, 29,29,30,58,30,29,30,30,30,29), / /7월 29일 도약 7월 29일
- array(47,30,29,30,29,29,30,29 ,29,30,29,30,30),
- array(36,30,29,30 ,29,30,29,30,29,29,30,29,30),
- 배열(25 ,30,29,30,30,59,29,30,29,29,30,29,30 ,29), //5월 29일 도약 5월 30일
- array(44,29,30,30, 29,30,30,29,30,29,29,30,29),
- array(32, 30,29,30,29,30,30,29,30,30,29,30,29) ,
- 배열(22,29,30,59,29,30,29,30,30,29, 30,30,29,29), //3월 29일 윤년 3월 30일
- );
- //윤년인지 여부
- private function IsLeapYear($AYear){
- return ($AYear % 4 == 0) && (($AYear % 100 != 0) || ($AYear % 400 == 0));
- }
- //그레고리력의 해당 월의 일 수 (연도:년; 월:월)
- 비공개 함수 GetSMon($year,$month)
- {
- if($ this->IsLeapYear($year) && $month == 2)
- return 29;
- else
- return $this->_SMDay[$month];
- }
- // 음력 이름 변환
- 비공개 함수 LYearName($year)
- {
- $Name = array("제로","1","2","3","4","5","6","7","8","9");
- for($i=0;$i<4;$i )
- for($k=0;$k<10;$ k )
- if($year[$i]==$k)
- $tmp.=$Name[$k];
- return $tmp;
- }
-
- 개인 함수 LMonName($month)
- {
- if($month > ;=1 && $month <=12 )
- {
- $Name = array( 1=>"긍정적"," 2","3","4","5","6" ,"7","8","9","10","11","12");
- return $Name[$month];
- }
- return $month;
- }
-
- 비공개 함수 LDayName($day)
- {
- if($day >=1 && $day <=30 )
- {
- $Name = array( 1 =>
- "1학년", "2학년", "3학년", "4학년", "5학년", "음력 보름날", "음력 칠석" ","음력 팔일","음력 구월","음력 열흘",
- "십일일","십이일","십삼일","십사일" , "열다섯", "식스틴", "세븐틴", "열여덟", "열아홉", "스물",
- "스물하나", "스물둘", "스물셋", "스물셋" " 4","스물다섯","스물여섯","스물일곱","스물여덟","스물아홉","서른"
- );
- return $Name[$ 일];
- }
- $day 반환;
- }
-
- //양력을 음력으로 변환(S날짜: 양력 날짜)
- 공개 함수 S2L($date)
- {
- list($year, $month, $day) = 폭발("- ", $date);
- if($year <= 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false;
- // 쿼리 날짜부터 올해 1월 1일까지의 일수를 구합니다
- $date1 = strtotime($year."-01-01");//올해 1월 1일
- $date2 = strtotime($year."- ".$month."-".$day);
- $days=round(($date2-$date1)/3600/24);
- $days = 1;
- //해당 연도의 음력 데이터를 Larray 배열로 변환하여 가져옵니다.
- $Larray = $this->_LMDay[$year - $this->_LStart];
- if($days <= $Larray[0])
- {
- $Lyear = $연도 - 1;
- $days = $Larray[0] - $days;
- $Larray = $this-> _LMDay[$Lyear - $this->_LStart];
- if($days < $Larray[12])
- {
- $Lmonth = 12;
- $Lday = $Larray[12 ] - $days;
- }
- else
- {
- $Lmonth = 11;
- $days = $days - $Larray[12];
- $Lday = $Larray[11 ] - $days;
- }
- }
- else
- {
- $Lyear = $year;
- $days = $days - $Larray[0];
- for( $i = 1;$i <= 12;$ i )
- {
- if($days > $Larray[$i]) $days = $days - $Larray[$i];
- else
- {
- if ($days > 30){
- $days = $days - $Larray[13];
- $Ltype = 1;
- }
-
- $Lmonth = $i;
- $Lday = $days;
- 휴식;
- }
- }
- }
- return mktime(0, 0, 0, $Lmonth, $Lday , $Lyear);
- //$Ldate = $Lyear."-".$Lmonth."-".$Lday;
- //$Ldate = $this->LYearName($Lyear)." 연도".$this->LMonName($Lmonth) ."month".$this->LDayName($Lday);
- //if($Ltype) $Ldate.="(鰰)";
- //return $Ldate;
- }
- //음력을 양력으로 변환 (날짜: 음력 날짜, 유형: 윤달 여부)
- 공개 함수 L2S($date,$ 유형 = 0)
- {
- list($year, $month, $day ) = Split("-",$date);
- if($year <= 1951 || $month < = 0 || $day <= 0 || $year >= 2051 ) return false ;
- $Larray = $this->_LMDay[$year - $this->_LStart];
- if ($type == 1 && count($Larray)<=12 ) return false;/ /윤월 쿼리를 요청했지만 윤달이 없습니다
- //쿼리하려는 음력이 윤월인 경우 해당 연도의 음력 배열에는 윤월 데이터가 포함되어 있으므로 가져옵니다
- if($Larray[$month]>30 && $type == 1 && count($Larray) >=13) $day = $ Larray[13] $day;
- //양력 1월 1일부터 음력 날짜까지의 일수를 구합니다.
- $days = $day;
- for($i=0;$i< =$month-1;$i )
- $days = $Larray[$i];
- //쿼리 음력 날짜가 양력 1월 1일보다 큰 경우 1년
- if($days > 366 || ($this->GetSMon($month,2)!=29 && $days>365 ))
- {
- $Syear = $1년;
- if($this- >GetSMon($month,2)!=29)
- $days-=366;
- else
- $days-=365;
- if( $days > $this->_SMDay [1])
- {
- $Smonth = 2;
- $Sday = $days - $this->_SMDay[1];
- }
- else
- {
- $Smonth = 1;
- $Sday = $days;
- }
- }
- else
- {
- $Syear =$year;
- for($i=1;$ i<=12;$i )
- {
- if($days > $this->GetSMon($Syear,$i))
- $days -=$this->GetSMon($ Syear,$i);
- else
- {
- $Smonth = $i;
- $Sday = $days;
- break;
- }
- }
- }
- return mktime(0, 0, 0, $Smonth, $Sday, $Syear);
- //$Sdate = $Syear."-".$Smonth." -".$Sday;
- / /return $Sdate;
- }
- }
- ?>
코드 복사
- require_once 'Lunar.php';
- $today = date("Y-m-d");
- $lunar = new Lunar();
- //양력을 음력으로 변환
- $nl = date("Y-m-d",$lunar->S2L($today));
- //음력을 양력으로 변환
- $ gl = date("Y-m-d ",$lunar->L2S($nl));
- echo "오늘의 양력은 다음과 같습니다: $today
";
- echo "음력으로 변환되는 날짜: $nl
" ;
- echo "그레고리력으로 다시 변환하는 방법: $gl
";
- ?>
코드 복사
|