>백엔드 개발 >PHP 튜토리얼 >PHP 음력 그레고리력 변환

PHP 음력 그레고리력 변환

WBOY
WBOY원래의
2016-07-25 09:09:452464검색
PHP 음력 그레고리력 변환
  1. /*
  2. 운남취징사범대학교 컴퓨터공학부 - 글: Yang Haixi
  3. 2009-9-3
  4. */
  5. class Lunar
  6. {
  7. private $_SMDay = array(1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); //정의 그레고리오력 월의 일수
  8. private $_LStart = 1950;//음력은 1950년에 시작됩니다.
  9. private $_LMDay = array(
  10. //차이: 첫 번째 날의 첫 번째 날 해당 연도의 음력 월부터 해당 연도의 양력 첫 번째 달의 1일까지의 일 수 1~12: 음력 월의 일수: 윤달이 있는 경우 기록; 해당 월의 보통일 수
  11. // 차이 1 2 3 4 5 6 7 8 9 10 11 12 도약
  12. array(47, 29,30,30,29,30,30,29,29, 30,29,30,29),
  13. 배열(36,30,29,30,30,29,30,29,30,29, 30,29,30),
  14. 배열(6,29, 30,29,30,59,29,30,30,29,30,29,30,29), //5월 29일 도약 5월 30일
  15. array(44,29,30,29,29,30,30 ,29,30,30,29,30,29),
  16. 배열(33,30,29,30,29,29,30 ,29,30,30,29,30,30),
  17. 배열 (23,29,30,59,29,29,30,29,30,29,30,30,30,29), // 3월 29일 도약 3월 30
  18. array(42,29,30,29, 30,29,29,30,29,30,29,30,30),
  19. 배열(30,30,29, 30,29,30,29,29,59,30,29,30,29, 30), //8월 30일 도약 8월 29
  20. array(48,30,30,30,29,30,29 ,29,30,29,30,29,30),
  21. array(38,29 ,30,30,29,30,29,30,29,30,29,30,29),
  22. 배열(27,30,29,30,29,30,59,30,29,30,29 ,30,29,30), //6월 30일 도약 6월 29일
  23. array(45,30,29, 30,29,30,29,30,30,29,30,29,30),
  24. 배열(35,29,30,29,29,30,29,30,30,29,30,30, 29),
  25. 배열(24,30,29,30,58,30,29,30, 29,30,30,30,29,29), //4월 29일 도약 4월 29
  26. 배열 (43,30,29,30,29,29,30,29,30,29,30,30,30 ),
  27. 배열(32,29,30,29,30,29,29,30,29 ,29,30,30,29),
  28. 배열(20,30,30,59,30,29 ,29,30,29,29,30,30,29,30), //3월 30일 도약 3월 29일
  29. array(39,30,30,29,30,30,29,29,30,29, 30,29,30),
  30. array(29,29,30,29,30, 30,29,59,30,29,30,29,30,30), //7월 30일 도약 7월 29일
  31. 배열(47,29,30,29,30,29,30,30,29 ,30,29,30,29),
  32. 배열(36,30,29,29,30,29,30,30 ,29,30,30,29,30),
  33. array(26,29 ,30,29,29,59,30,29,30,30,30,29,30,30), //5월 30일 도약 5월 29일
  34. array(45,29,30,29,29, 30,29,30,29,30,30,29,30),
  35. array(33,30,29,30,29, 29,30,29,29,30,30,29,30),
  36. 배열(22,30,30,29,59,29,30,29,29,30,30,29,30,30) , //4월 30일 도약 4월 29일
  37. array(41,30 ,30,29,30,29,29,30,29,29,30,29,30),
  38. array(30,30,30 ,29,30,29,30,29,59,29,30 ,29,30,30), //8월 30일 도약 8월 29
  39. array(48,30,29,30,30,29,30, 29,30,29,30,29,29),
  40. 배열(37,30,29,30,30,29,30,30,29,30,29,30,29),
  41. 배열( 27,30,29,29,30,29,60, 29,30,30,29,30,29,30), //6월 30일 도약 6월 30
  42. 배열(46,30,29,29,30 ,29,30,29,30,30,29,30,30),
  43. 배열(35,29,30,29,29,30,29,29,30,30,29,30,30),
  44. array(24,30,29,30 ,58,30,29,29,30,29,30,30,30,29), //4월 29일 도약 4월 29일
  45. array(43,30, 29,30,29,29,30, 29,29,30,29,30,30),
  46. 배열(32,30,29,30,30,29,29,30,29,29,59, 30,30,30), //10월 30일 도약 10월 29일
  47. array(50,29,30,30,29,30,29,30,29,29,30,29,30),
  48. 배열(39,29,30,30,29,30,30,29,30,29,30,29,29),
  49. 배열(28,30,29,30,29,30,59,30, 30,29,30,29,29 ,30), //6월 30일 도약 6월 29
  50. 배열(47,30,29,30,29,30,29,30,30,29,30,30,29 ),
  51. 배열( 36,30,29,29,30,29,30,29,30,29,30,30,30),
  52. 배열(26,29,30,29,29,59 ,29,30,29, 30,30,30,30,30), //5월 30일 도약 5월 29일
  53. array(45,29,30,29,29,30,29,29,30,29, 30,30,30 ),
  54. 배열(34,29,30,30,29,29,30,29,29,30,29,30,30),
  55. 배열(22,29,30, 59,30,29 ,30,29,29,30,29,30,29,30), //3월 30일 도약 3월 29일
  56. array(40,30,30,30,29,30,29,30 ,29, 29,30,29,30),
  57. array(30,29,30,30,29,30,29,30,59,29,30,29,30,30), //8월 30일 , 윤팔 29번째 달
  58. array(49,29,30,29,30,30,29,30,29,30,30,29,29),
  59. array(37,30,29,30, 29,30 ,29,30,30,29,30,30,29),
  60. 배열(27,30,29,29,30,58,30,30,29,30,30,29,30, 29), //5월 29일 도약 5월 29일
  61. array(46,30,29,29,30,29,29,30,29,30,30,30,29),
  62. array(35,30 , 30,29,29,30,29,29,30,29,30,30,29),
  63. 배열(23,30,30,29,59,30,29,29,30,29,30 , 29,30,30), //4월 30일 도약 4월 29
  64. array(42,30,30,29,30,29,30,29,29,30,29,30,29),
  65. 배열(31,30,30,29,30,30,29,30,29,29,30,29,30),
  66. 배열(21,29,59,30,30,29,30,29 , 30,29,30,29,30,30), //2월 30일 도약 2월 29
  67. array(39,29,30,29,30,29,30,30,29,30,29, 30,29 ),
  68. array(28,30,29,30,29,30,29,59,30,30,29,30,30,30), //7월 30일 도약 7월 29
  69. array(48, 29,29,30,29,29,30,29,30,30,30,29,30),
  70. 배열(37,30,29,29,30,29,29,30,29,30, 30,29,30),
  71. array(25,30,30,29,29,59,29,30,29,30,29,30,30,30), //5월 30일 도약 5월 29일
  72. 배열(44,30,29,30,29,30,29,29,30,29,30,29,30),
  73. 배열(33,30,29,30, 30,29,30,29 ,29,30,29,30,29),
  74. array(22,30,29,30,59,30,29,30,29,30,29,30,29, 30), //4월 30일 도약 4월 29일
  75. array(40,30,29,30,29,30,30,29,30,29,30,29,30),
  76. array(30 ,29,30,29,30, 29,30,29,30,59,30,29,30,30), //9월 30일 도약 9월 29일
  77. 배열(49,29,30,29,29,30,29,30,30,30,29,30,29),
  78. 배열(38,30,29,30,29,29,30,29, 30,30,29,30,30),
  79. array(27,29,30,29,30,29,59,29,30,29,30,30,30,29), //6월 29일 도약 6월 30일
  80. 배열(46,29,30,29,30,29,29,30,29,30,29,30,30),
  81. 배열(35,30,29,30,29 ,30 ,29,29,30,29,29,30,30),
  82. 배열(24,29,30,30,59,30,29,29,30,29,30,29,30,30), //4월 30일 도약 4월 29일
  83. array(42,29,30,30,29,30,29,30,29,30,29,30,29),
  84. array(31, 30,29, 30,29,30,30,29,30,29,30,29,30),
  85. 배열(21,29,59,29,30,30,29,30,30,29, 30,29, 30,30), //2월 30일 도약 2월 29일
  86. array(40,29,30,29,29,30,29,30,30,29,30,30,29),
  87. array(28 ,30,29,30,29,29,59,30,29,30,30,30,29,30), //6월 30일 도약 6월 29일
  88. array(47, 30,29,30,29, 29,30,29,29,30,30,30,29),
  89. 배열(36,30,30,29,30,29,29,30,29,29, 30,30,29),
  90. array(25,30,30,30,29,59,29,30,29,29,30,30,29,30), //5월 30일 도약 5월 29일
  91. array(43,30,30 ,29,30,29,30,29,30,29,29,30,30),
  92. 배열(33,29,30,29,30,30,29 ,30,29,30,29,30 ,29),
  93. array(22,29,30,59,30,29,30,30,29,30,29,30,29,30), // 3월 30일 도약 3월 29일
  94. array( 41,30,29,29,30,29,30,30,29,30,30,29,30),
  95. 배열(30,29,30, 29,29,30,29,30,29, 30,30,59,30,30), //11월 30일 도약 11월 29
  96. array(49,29,30,29,29,30 ,29,30,29,30,30,29,30),
  97. 배열(38,30,29,30,29,29,30,29,29,30,30,29,30),
  98. 배열(27,30,30,29,30,29,59 ,29,29,30,29,30,30,29), //6월 29일 도약 6월 30
  99. array(45,30, 30,29,30,29,29,30,29,29,30, 29,30),
  100. 배열(34,30,30,29,30,29,30,29,30,29,29, 30,29),
  101. 배열(23,30,30,29, 30,59,30,29,30,29,30,29,29,30), //5월 30일 도약 5월 29
  102. array(42,30,29,30,30,29,30,29,30 ,30,29,30,29),
  103. 배열(31,29,30,29,30,29,30,30 ,29,30,30,29,30),
  104. 배열(21,29 ,59,29,30,29,30,29,30,30,29,30,30,30), //2월 30일 도약 2월 29일
  105. array(40,29,30,29,29,30, 29,29,30,30,29,30,30),
  106. 배열(29,30,29,30, 29,29,30,58,30,29,30,30,30,29), / /7월 29일 도약 7월 29일
  107. array(47,30,29,30,29,29,30,29 ,29,30,29,30,30),
  108. array(36,30,29,30 ,29,30,29,30,29,29,30,29,30),
  109. 배열(25 ,30,29,30,30,59,29,30,29,29,30,29,30 ,29), //5월 29일 도약 5월 30일
  110. array(44,29,30,30, 29,30,30,29,30,29,29,30,29),
  111. array(32, 30,29,30,29,30,30,29,30,30,29,30,29) ,
  112. 배열(22,29,30,59,29,30,29,30,30,29, 30,30,29,29), //3월 29일 윤년 3월 30일
  113. );
  114. //윤년인지 여부
  115. private function IsLeapYear($AYear){
  116. return ($AYear % 4 == 0) && (($AYear % 100 != 0) || ($AYear % 400 == 0));
  117. }
  118. //그레고리력의 해당 월의 일 수 (연도:년; 월:월)
  119. 비공개 함수 GetSMon($year,$month)
  120. {
  121. if($ this->IsLeapYear($year) && $month == 2)
  122. return 29;
  123. else
  124. return $this->_SMDay[$month];
  125. }
  126. // 음력 이름 변환
  127. 비공개 함수 LYearName($year)
  128. {
  129. $Name = array("제로","1","2","3","4","5","6","7","8","9");
  130. for($i=0;$i<4;$i )
  131. for($k=0;$k<10;$ k )
  132. if($year[$i]==$k)
  133. $tmp.=$Name[$k];
  134. return $tmp;
  135. }
  136. 개인 함수 LMonName($month)
  137. {
  138. if($month > ;=1 && $month <=12 )
  139. {
  140. $Name = array( 1=>"긍정적"," 2","3","4","5","6" ,"7","8","9","10","11","12");
  141. return $Name[$month];
  142. }
  143. return $month;
  144. }
  145. 비공개 함수 LDayName($day)
  146. {
  147. if($day >=1 && $day <=30 )
  148. {
  149. $Name = array( 1 =>
  150. "1학년", "2학년", "3학년", "4학년", "5학년", "음력 보름날", "음력 칠석" ","음력 팔일","음력 구월","음력 열흘",
  151. "십일일","십이일","십삼일","십사일" , "열다섯", "식스틴", "세븐틴", "열여덟", "열아홉", "스물",
  152. "스물하나", "스물둘", "스물셋", "스물셋" " 4","스물다섯","스물여섯","스물일곱","스물여덟","스물아홉","서른"
  153. );
  154. return $Name[$ 일];
  155. }
  156. $day 반환;
  157. }
  158. //양력을 음력으로 변환(S날짜: 양력 날짜)
  159. 공개 함수 S2L($date)
  160. {
  161. list($year, $month, $day) = 폭발("- ", $date);
  162. if($year <= 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false;
  163. // 쿼리 날짜부터 올해 1월 1일까지의 일수를 구합니다
  164. $date1 = strtotime($year."-01-01");//올해 1월 1일
  165. $date2 = strtotime($year."- ".$month."-".$day);
  166. $days=round(($date2-$date1)/3600/24);
  167. $days = 1;
  168. //해당 연도의 음력 데이터를 Larray 배열로 변환하여 가져옵니다.
  169. $Larray = $this->_LMDay[$year - $this->_LStart];
  170. if($days <= $Larray[0])
  171. {
  172. $Lyear = $연도 - 1;
  173. $days = $Larray[0] - $days;
  174. $Larray = $this-> _LMDay[$Lyear - $this->_LStart];
  175. if($days < $Larray[12])
  176. {
  177. $Lmonth = 12;
  178. $Lday = $Larray[12 ] - $days;
  179. }
  180. else
  181. {
  182. $Lmonth = 11;
  183. $days = $days - $Larray[12];
  184. $Lday = $Larray[11 ] - $days;
  185. }
  186. }
  187. else
  188. {
  189. $Lyear = $year;
  190. $days = $days - $Larray[0];
  191. for( $i = 1;$i <= 12;$ i )
  192. {
  193. if($days > $Larray[$i]) $days = $days - $Larray[$i];
  194. else
  195. {
  196. if ($days > 30){
  197. $days = $days - $Larray[13];
  198. $Ltype = 1;
  199. }
  200. $Lmonth = $i;
  201. $Lday = $days;
  202. 휴식;
  203. }
  204. }
  205. }
  206. return mktime(0, 0, 0, $Lmonth, $Lday , $Lyear);
  207. //$Ldate = $Lyear."-".$Lmonth."-".$Lday;
  208. //$Ldate = $this->LYearName($Lyear)." 연도".$this->LMonName($Lmonth) ."month".$this->LDayName($Lday);
  209. //if($Ltype) $Ldate.="(鰰)";
  210. //return $Ldate;
  211. }
  212. //음력을 양력으로 변환 (날짜: 음력 날짜, 유형: 윤달 여부)
  213. 공개 함수 L2S($date,$ 유형 = 0)
  214. {
  215. list($year, $month, $day ) = Split("-",$date);
  216. if($year <= 1951 || $month < = 0 || $day <= 0 || $year >= 2051 ) return false ;
  217. $Larray = $this->_LMDay[$year - $this->_LStart];
  218. if ($type == 1 && count($Larray)<=12 ) return false;/ /윤월 쿼리를 요청했지만 윤달이 없습니다
  219. //쿼리하려는 음력이 윤월인 경우 해당 연도의 음력 배열에는 윤월 데이터가 포함되어 있으므로 가져옵니다
  220. if($Larray[$month]>30 && $type == 1 && count($Larray) >=13) $day = $ Larray[13] $day;
  221. //양력 1월 1일부터 음력 날짜까지의 일수를 구합니다.
  222. $days = $day;
  223. for($i=0;$i< =$month-1;$i )
  224. $days = $Larray[$i];
  225. //쿼리 음력 날짜가 양력 1월 1일보다 큰 경우 1년
  226. if($days > 366 || ($this->GetSMon($month,2)!=29 && $days>365 ))
  227. {
  228. $Syear = $1년;
  229. if($this- >GetSMon($month,2)!=29)
  230. $days-=366;
  231. else
  232. $days-=365;
  233. if( $days > $this->_SMDay [1])
  234. {
  235. $Smonth = 2;
  236. $Sday = $days - $this->_SMDay[1];
  237. }
  238. else
  239. {
  240. $Smonth = 1;
  241. $Sday = $days;
  242. }
  243. }
  244. else
  245. {
  246. $Syear =$year;
  247. for($i=1;$ i<=12;$i )
  248. {
  249. if($days > $this->GetSMon($Syear,$i))
  250. $days -=$this->GetSMon($ Syear,$i);
  251. else
  252. {
  253. $Smonth = $i;
  254. $Sday = $days;
  255. break;
  256. }
  257. }
  258. }
  259. return mktime(0, 0, 0, $Smonth, $Sday, $Syear);
  260. //$Sdate = $Syear."-".$Smonth." -".$Sday;
  261. / /return $Sdate;
  262. }
  263. }
  264. ?>
코드 복사
  1. require_once 'Lunar.php';
  2. $today = date("Y-m-d");
  3. $lunar = new Lunar();
  4. //양력을 음력으로 변환
  5. $nl = date("Y-m-d",$lunar->S2L($today));
  6. //음력을 양력으로 변환
  7. $ gl = date("Y-m-d ",$lunar->L2S($nl));
  8. echo "오늘의 양력은 다음과 같습니다: $today
    ";
  9. echo "음력으로 변환되는 날짜: $nl
    " ;
  10. echo "그레고리력으로 다시 변환하는 방법: $gl
    ";
  11. ?>
코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.