>  기사  >  백엔드 개발  >  축제, 절기 및 음력 교환을 계산하기 위한 PHP 코드

축제, 절기 및 음력 교환을 계산하기 위한 PHP 코드

WBOY
WBOY원래의
2016-07-25 08:56:081823검색
  1. /*
  2. * 农历 节气 节日
  3. * 편집: bbs.it-home.org
  4. */
  5. class Lunar {
  6. var $MIN_YEAR = 1891;
  7. var $MAX_YEAR = 2100;
  8. var $lunarInfo = 배열(
  9. 배열(0,2,9,21936), 배열(6,1,30,9656), 배열(0,2,17,9584), 배열(0,2 ,6,21168),배열(5,1,26,43344),배열(0,2,13,59728),
  10. 배열(0,2,2,27296),배열(3,1,22, 44368),배열(0,2,10,43856),배열(8,1,30,19304),배열(0,2,19,19168),배열(0,2,8,42352),
  11. 배열(5,1,29,21096), 배열(0,2,16,53856), 배열(0,2,4,55632), 배열(4,1,25,27304), 배열(0,2, 13,22176),배열(0,2,2,39632),
  12. 배열(2,1,22,19176),배열(0,2,10,19168),배열(6,1,30,42200 ),배열(0,2,18,42192),배열(0,2,6,53840),배열(5,1,26,54568),
  13. 배열(0,2,14,46400),배열 (0,2,3,54944), 배열(2,1,23,38608), 배열(0,2,11,38320), 배열(7,2,1,18872), 배열(0,2,20 ,18800),
  14. 배열(0,2,8,42160), 배열(5,1,28,45656), 배열(0,2,16,27216), 배열(0,2,5,27968) ,배열(4,1,24,44456),배열(0,2,13,11104),
  15. 배열(0,2,2,38256),배열(2,1,23,18808),배열( 0,2,10,18800), 배열(6,1,30,25776), 배열(0,2,17,54432), 배열(0,2,6,59984),
  16. 배열(5,1 ,26,27976), 배열(0,2,14,23248), 배열(0,2,4,11104), 배열(3,1,24,37744), 배열(0,2,11,37600), 배열(7,1,31,51560),
  17. 배열(0,2,19,51536), 배열(0,2,8,54432), 배열(6,1,27,55888), 배열(0 ,2,15,46416), 배열(0,2,5,22176), 배열(4,1,25,43736),
  18. 배열(0,2,13,9680), 배열(0,2, 2,37584), 배열(2,1,22,51544), 배열(0,2,10,43344), 배열(7,1,29,46248), 배열(0,2,17,27808),
  19. 배열(0,2,6,46416),배열(5,1,27,21928),배열(0,2,14,19872),배열(0,2,3,42416),배열(3, 1,24,21176), 배열(0,2,12,21168),
  20. 배열(8,1,31,43344), 배열(0,2,18,59728), 배열(0,2,8 ,27296),배열(6,1,28,44368),배열(0,2,15,43856),배열(0,2,5,19296),
  21. 배열(4,1,25,42352) ,배열(0,2,13,42352),배열(0,2,2,21088),배열(3,1,21,59696),배열(0,2,9,55632),배열(7,1 ,30,23208),
  22. 배열(0,2,17,22176), 배열(0,2,6,38608), 배열(5,1,27,19176), 배열(0,2,15, 19152),배열(0,2,3,42192),배열(4,1,23,53864),
  23. 배열(0,2,11,53840),배열(8,1,31,54568), 배열(0,2,18,46400), 배열(0,2,7,46752), 배열(6,1,28,38608), 배열(0,2,16,38320),
  24. 배열(0 ,2,5,18864), 배열(4,1,25,42168), 배열(0,2,13,42160), 배열(10,2,2,45656), 배열(0,2,20,27216 ),배열(0,2,9,27968),
  25. 배열(6,1,29,44448),배열(0,2,17,43872),배열(0,2,6,38256),배열 (5,1,27,18808), 배열(0,2,15,18800), 배열(0,2,4,25776),
  26. 배열(3,1,23,27216), 배열(0, 2,10,59984), 배열(8,1,31,27432), 배열(0,2,19,23232), 배열(0,2,7,43872), 배열(5,1,28,37736) ,
  27. 배열(0,2,16,37600), 배열(0,2,5,51552), 배열(4,1,24,54440), 배열(0,2,12,54432), 배열( 0,2,1,55888),배열(2,1,22,23208),
  28. 배열(0,2,9,22176),배열(7,1,29,43736),배열(0,2 ,18,9680), 배열(0,2,7,37584), 배열(5,1,26,51544), 배열(0,2,14,43344),
  29. 배열(0,2,3, 46240), 배열(4,1,23,46416), 배열(0,2,10,44368), 배열(9,1,31,21928), 배열(0,2,19,19360), 배열(0 ,2,8,42416),
  30. 배열(6,1,28,21176), 배열(0,2,16,21168), 배열(0,2,5,43312), 배열(4,1, 25,29864),배열(0,2,12,27296),배열(0,2,1,44368),
  31. 배열(2,1,22,19880),배열(0,2,10,19296) ),배열(6,1,29,42352),배열(0,2,17,42208),배열(0,2,6,53856),배열(5,1,26,59696),
  32. 배열 (0,2,13,54576), 배열(0,2,3,23200), 배열(3,1,23,27472), 배열(0,2,11,38608), 배열(11,1,31 ,19176),배열(0,2,19,19152),
  33. 배열(0,2,8,42192),배열(6,1,28,53848),배열(0,2,15,53840) ,배열(0,2,4,54560),배열(5,1,24,55968),배열(0,2,12,46496),
  34. 배열(0,2,1,22224),배열( 2,1,22,19160), 배열(0,2,10,18864), 배열(7,1,30,42168), 배열(0,2,17,42160), 배열(0,2,6, 43600),
  35. 배열(5,1,26,46376), 배열(0,2,14,27936), 배열(0,2,2,44448), 배열(3,1,23,21936), 배열(0,2,11,37744), 배열(8,2,1,18808),
  36. 배열(0,2,19,18800), 배열(0,2,8,25776), 배열(6 ,1,28,27216),배열(0,2,15,59984),배열(0,2,4,27424),배열(4,1,24,43872),
  37. 배열(0,2, 12,43744), 배열(0,2,2,37600), 배열(3,1,21,51568), 배열(0,2,9,51552), 배열(7,1,29,54440), 배열 (0,2,17,54432),
  38. 배열(0,2,5,55888), 배열(5,1,26,23208), 배열(0,2,14,22176), 배열(0, 2,3,42704), 배열(4,1,23,21224), 배열(0,2,11,21200),
  39. 배열(8,1,31,43352), 배열(0,2,19 ,43344), 배열(0,2,7,46240), 배열(6,1,27,46416), 배열(0,2,15,44368), 배열(0,2,5,21920),
  40. 배열(4,1,24,42448), 배열(0,2,12,42416), 배열(0,2,2,21168), 배열(3,1,22,43320), 배열(0,2 ,9,26928),배열(7,1,29,29336),
  41. 배열(0,2,17,27296),배열(0,2,6,44368),배열(5,1,26, 19880), 배열(0,2,14,19296), 배열(0,2,3,42352), 배열(4,1,24,21104),
  42. 배열(0,2,10,53856), 배열(8,1,30,59696), 배열(0,2,18,54560), 배열(0,2,7,55968), 배열(6,1,27,27472), 배열(0,2, 15,22224),
  43. 배열(0,2,5,19168), 배열(4,1,25,42216), 배열(0,2,12,42192), 배열(0,2,1,53584 ),배열(2,1,21,55592),배열(0,2,9,54560)
  44. );
  45. /**
  46. * 将阳历转换为阴历
  47. * @param year 公历-年
  48. * @param 월 날짜
  49. * @param 날짜 날짜
  50. */
  51. function ConvertSolarToLunar($year,$month,$date){
  52. //debugger;
  53. $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
  54. if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
  55. return array(1891,'현재','새','준비',1 ,1 ,'兔');
  56. }
  57. return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));
  58. }
  59. function ConvertSolarMonthToLunar($year,$month) {
  60. $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
  61. if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
  62. return array(1891,'현재','새','준비',1 ,1 ,'兔');
  63. }
  64. $month_days_ary = 배열(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  65. $dd = $month_days_year[$month];
  66. if($this->isLeapYear($year) && $month == 2) $dd ;
  67. $lunar_year = 배열();
  68. for ($i = 1; $i $array = $this-&getsLunarCityBetween($year,$this-getsDaysBetweenSolar($year, $month, $i, $ yearData[1], $yearData[2]));
  69. $array[] = $연도. '-' $월 . '-' $나는;
  70. $lunar_year[$i] = $배열;
  71. }
  72. $lunar_year를 반환합니다.
  73. }
  74. /**
  75. * 음력을 양력으로 변환
  76. * @param year lunar Calendar - 연도
  77. * @param Month lunar Calendar - 월, 윤달 처리: 예를 들어 5월에 윤달이 있는 경우 두 번째 5월은 6월로 전달되며 이는 음력 13개월에 해당하지만 때로는 13월의 일수가 0이 되는 경우도 있습니다.
  78. * @param date lunar Calendar-day
  79. */
  80. 함수 ConvertLunarToSolar($year,$month,$date){
  81. $yearData = $this->lunarInfo[$year-$this- ; >MY_YEAR];
  82. $between = $this->getDaysBetweenLunar($연도,$월,$날짜);
  83. $res = mktime(0,0,0,$yearData[1],$yearData[2],$year);
  84. $res = date('연월일', $res $between*24*60*60);
  85. $day = 폭발('-', $res);
  86. $년 = $day[0];
  87. $월= $day[1];
  88. $day = $day[2];
  89. 반환 배열($연도, $월, $일);
  90. }
  91. /**
  92. * 윤년인지 판단
  93. * @param year
  94. */
  95. 함수 isLeapYear($year){
  96. return(($year%4==0 && $year 0 !=0) ||( $ 연도@0==0));
  97. }
  98. /**
  99. * 줄기 및 분기 연도 가져오기
  100. * @param 연도
  101. */
  102. function getLunarYearName($year){
  103. $sky = array('sun','plant','sun','sun','甲', '그들', '그들', '그들', '그들', '그들');
  104. $earth = array('토지','값','물','사람','도시','도시','도시','도시','도시','도시','도시 ','未');
  105. $년 = $년.'';
  106. $sky[$year{3}].$earth[$year]를 반환합니다.
  107. }
  108. /**
  109. * 음력에 따른 별자리 구하기
  110. * @param year 음력
  111. */
  112. function getYearZodiac($year){
  113. $zodiac = array('base','value','base','base'鼠' ,'표시','연설','연설','연설','연설','연설','연설');
  114. $zodiac[$연도]를 반환합니다.
  115. }
  116. /**
  117. * 그레고리력 월의 일수 가져오기
  118. * @param year 그레고리오력-연도
  119. * @param Month 그레고리력-월
  120. */
  121. 함수 getSolarMonthDays($year,$month){
  122. $monthHash = array('1'=>31,'2'=> $this->isLeapYear($year)?29:28,'3'=>31,'4'=>30,'5'=>31,'6'=>30,'7 = >31,'8'=>31,'9'=>30,'10'=>31,'11'=>30,'12'=>31);
  123. return $monthHash["$month"];
  124. }
  125. /**
  126. * 음력 월의 일수 구하기
  127. * @param year lunar Calendar - 연도
  128. * @param Month lunar Calendar - 월, 1월부터 시작
  129. */
  130. 함수 getLunarMonthDays($year,$month){
  131. $monthData = $this->getLunarMonths($year);
  132. return $ MonthData [ $ 월 - 1 ] ;
  133. }
  134. /**
  135. * 음력 각 달의 날짜 배열 가져오기
  136. * @param year
  137. */
  138. 함수 getLunarMonths($year){
  139. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  140. $leapMonth = $yearData[0];
  141. $bit = decbin($yearData[3]);
  142. for ($i = 0; $i < str($bit);$i) {
  143. $bitArray[$i] = substr($bit, $i, 1);
  144. }
  145. for($k=0, $clan=16-count($bitArray);$c<$clan;$k){
  146. array_unshift($bitArray, '0');
  147. }
  148. $bitArray = array_slice($bitArray,0,($leapMonth==0?12:13));
  149. for($i=0; $i $bitArray[$i] = $bitArray[$i] 29;
  150. }
  151. $bitArray를 반환합니다.
  152. }
  153. /**
  154. * 각 음력의 일수를 구합니다
  155. * @param year 음력
  156. */
  157. 함수 getLunarYearDays($year){
  158. $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
  159. $monthArray = $this->getLunarYearMonths($year);
  160. $len = count($monthArray);
  161. return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]);
  162. }
  163. function getLunarYearMonths($year){
  164. //debugger;
  165. $monthData = $this->getLunarMonths($년);
  166. $res=배열();
  167. $온도=0;
  168. $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
  169. $len = ($yearData[0]==0?12:13);
  170. for($i=0;$i<$len;$i ){
  171. $temp=0;
  172. for($j=0;$j<=$i;$j ){
  173. $temp =$monthData[$j];
  174. }
  175. array_push($res, $temp);
  176. }
  177. $res 반환;
  178. }
  179. /**
  180. * 윤달 받기
  181. * @param 년 음력
  182. */
  183. 함수 getLeapMonth($year){
  184. $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
  185. $yearData[0] 반환;
  186. }
  187. /**
  188. * 음력 날짜와 음력 1월 1일 사이의 일수 계산
  189. * @param year
  190. * @param Month
  191. * @param date
  192. */
  193. 함수 getDaysBetweenLunar($year,$month,$date){
  194. $yearMonth = $this->getLunarMonths($year);
  195. $res=0;
  196. for($i=1;$i<$month;$i ){
  197. $res =$yearMonth[$i-1];
  198. }
  199. $res =$date-1;
  200. $res를 반환합니다.
  201. }
  202. /**
  203. * 두 양력 날짜 사이의 일수를 계산합니다.
  204. * @param year 그레고리력 연도
  205. * @param cmonth
  206. * @param cdate
  207. * @param dmonth 해당하는 양력 월 음력 정월까지
  208. * @param ddate 음력 1일에 해당하는 양력 일수
  209. */
  210. 함수 getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){
  211. $a = mktime(0,0,0 ,$c월,$c날짜,$년);
  212. $b = mktime(0,0,0,$d월,$ddate,$년);
  213. return ceil(($a-$b)/24/3600);
  214. }
  215. /**
  216. * 음력 1월 1일부터 일수를 기준으로 음력 날짜 계산
  217. * @param year 그레고리오력
  218. * @param 날짜 간
  219. */
  220. function getLunarByBetween($year,$between){
  221. //debugger;
  222. $lunarArray = 배열();
  223. $yearMonth=배열();
  224. $t=0;
  225. $e=0;
  226. $leapMonth=0;
  227. $m='';
  228. if($between==0){
  229. array_push($lunarArray, $year,'정월','初一');
  230. $t = 1;
  231. $e = 1;
  232. }else{
  233. $연도 = $between>0? $연도: ($연도-1);
  234. $yearMonth = $this->getLunarYearMonths($년);
  235. $leapMonth = $this->getLeapMonth($년);
  236. $between = $between>0?$between : ($this->getLunarYearDays($year) $between);
  237. for($i=0;$i if($between==$yearMonth[$i]){
  238. $t=$i 2;
  239. $e=1;
  240. 휴식;
  241. }else if($between<$yearMonth[$i]){
  242. $t=$i 1;
  243. $e=$between-(emptyempty($yearMonth[$i-1])?0:$yearMonth[$i-1]) 1;
  244. 휴식;
  245. }
  246. }
  247. $m = ($leapMonth!=0&&$t==$leapMonth 1)?('闰'.$this->getCapitalNum($t- 1,true)): $this->getCapitalNum(($leapMonth!=0&&$leapMonth 1<$t?($t-1):$t),true);
  248. array_push($lunarArray,$year,$m,$this->getCapitalNum($e,false));
  249. }
  250. array_push($lunarArray,$this->getLunarYearName($year));// 天干地支
  251. array_push($lunarArray,$t,$e);
  252. array_push($lunarArray,$this->getYearZodiac($year));// 12주년
  253. array_push($lunarArray,$leapMonth);// 闰几月
  254. return $lunarArray;
  255. }
  256. /**
  257. * 숫자의 음력 이름 가져오기
  258. * @param num number
  259. * @param isMonth 해당 월의 숫자인지 여부
  260. */
  261. 함수 getCapitalNum($num,$isMonth){
  262. $isMonth = $isMonth || false
  263. $dateHash=array('0'=> '','1'=>'하나','2'=>'둘','3'=>'셋','4'=>'넷','5'=>' 다섯','6'=>'여섯','7'=>'일곱','8'=>'여덟','9'=>'아홉','10'=>' 10');
  264. $monthHash=array('0'=>'','1'=>'첫 번째 달','2'=>'2월','3'=>'3 월','4'=>'4월','5'=>'5월','6'=>'6월','7'=>'7월','8' =>' 8월','9'=>'9월','10'=>'10월','11'=>'겨울의 달','12'=>'십이월' )
  265. $ res='';
  266. if($isMonth){
  267. $res = $monthHash[$num]
  268. }else{
  269. if($num<=10) {
  270. $res = 'chu'.$dateHash[$num]
  271. }else if($num>10&&$num<20){
  272. $res = '十'.$dateHash[$num -10]; > }else if($num==20){
  273. $res = "20";
  274. }else if($num>20&&$num<30){
  275. $ res = "廿".$ dateHash[$num-20]
  276. }else if($num==30){
  277. $res = "thirty";
  278. }
  279. return $res; }
  280. /*
  281. * 절기에 대한 일반 알고리즘
  282. */
  283. 함수 getJieQi($_year,$month,$day)
  284. {
  285. $year = substr( $_year,-2) 0;
  286. $coefficient = array(
  287. array(5.4055,2019,-1),//Xiaohan
  288. array(20.12,2082,1), //큰 추위
  289. array(3.87),//봄의 시작
  290. array(18.74,2026,-1),//빗물
  291. array(5.63),//Jingzhe
  292. array(20.646,2084, 1) ,//춘분
  293. array(4.81),//청명
  294. array(20.1),//구우
  295. array(5.52,1911,1),//여름의 시작
  296. array( 21.04, 2008,1),//Xiaoman
  297. array(5.678,1902,1),//Mangzhong
  298. array(21.37,1928,1),//Summer Solstice
  299. array(7.108,2016, 1), //소더위
  300. 배열(22.83,1922,1),//대더위
  301. 배열(7.5,2002,1),//가을의 시작
  302. 배열(23.13),// 끝더위
  303. 배열(7.646 ,1927,1),//백이슬
  304. 배열(23.042,1942,1),//추분
  305. 배열(8.318),//냉이슬
  306. 배열 (23.438,2089,1),//Frostfall
  307. array(7.438,2089,1),//겨울의 시작
  308. array(22.36,1978,1),//Light snow
  309. array( 7.18,1954,1),//폭설
  310. array( 21.94,2021,-1)//동지
  311. )
  312. $term_name = array(
  313. "약간 추움", "큰 춥다', '봄의 시작', '비', '징저', '춘분', '청명', '곡물비',
  314. '여름의 시작', '샤오만', '곡물', '여름 Solstice', '소더위', '대더위', '가을의 시작', '더위의 끝',
  315. '흰 이슬', '추분', '찬 이슬', '서리강하', '시작' of Winter", "Light Snow", "Heavy Snow", "Winter Solstice");
  316. $idx1 = ($month-1)*2;
  317. $_leap_value = Floor(($year- 1)/4);
  318. $day1 = Floor($year*0.2422 $coefficient[$idx1][0])-$_leap_value
  319. if(isset ($coefficient[$idx1][1 ])&&$계수[$idx1][1]==$_year)
  320. {
  321. $day1 = $coefficient[$idx1][2]
  322. }
  323. $day2 = Floor($ year*0.2422 $coefficient[$idx1 1][0])-$_leap_value;
  324. if(isset($coefficient[$idx1 1][1])&&$coefficient[$ idx1 1][1]==$ _연도)
  325. {
  326. $day1 = $coefficient[$idx1 1][2]
  327. }
  328. //echo __FILE__.'->'. day1,',$day2='.$day2.'
    '.chr(10)
  329. if($day==$day1) return $term_name [$idx1]
  330. if ($day==$day2) $term_name[$idx1 1] 반환
  331. '' 반환
  332. }
  333. /*
  334. * 축제 가져오기: 이 함수를 수정해야만 특별한 축제를 계산할 수 있습니다.
  335. */
  336. function getFestival($today, $nl_info = false,$config = 1)
  337. {
  338. if($config == 1)
  339. {
  340. $arr_lunar=array('01-01'=>'봄 축제','01-15'=>'등불 축제 ' ,'02-02'=>'2월 2일','05-05'=>'단오절','07-07'=>'칠석절','08-15'=> '중추절','09-09'=>'중9절','12-08'=>'라바 축제','12-23'=>'소년'); > $arr_solar= array('01-01'=>'설날','02-14'=>'발렌타인데이','03-12'=>'식목일','04-01 '=>'만우절','05-01'=>'노동절','06-01'=>'어린이날','10-01'=>'국경의 날','10 -31'=> '할로윈','12-24'=>'크리스마스 이브','12-25'=>'크리스마스')
  341. }//다른 공휴일을 사용하세요. $config, $arr_lunar 및 $arr_solar 구성
  342. $festivals = array()
  343. list($y,$m,$d) =explore('-',$today) );
  344. if (!$nl_info) $nl_info = $this->convertSolarToLunar($y,intval($m),intval($d))
  345. if($nl_info[7] >0&&$nl_info[ 7]<$nl_info[4]) $nl_info[4]-=1
  346. $md_lunar = substr('0'.$nl_info[4],-2).'-' .substr('0' .$nl_info[5],-2);
  347. $md_solar=substr_replace($today,'',0,5)
  348. isset($arr_lunar[$md_lunar] )?array_push($festivals , $arr_lunar[$md_lunar]):'';
  349. isset($arr_solar[$md_solar])?array_push($festivals, $arr_solar[$md_solar]):'';
  350. $glweek = date("w",strtotime($today)); //0-6
  351. if($m==5&&($d>7)&&($d<15) &&($glweek== 0))array_push($festivals, "어머니의 날")
  352. if($m==6&&($d>14)&&($d<22)&&($glweek==0 ))array_push($festivals ,"아버지의 날")
  353. $jieqi = $this->getJieQi($y,$m,$d)
  354. if($jieqi)array_push($ 축제,$jieqi);
  355. return implode('/',$festivals);
  356. }
  357. }
  358. header("Content-Type:text/html;charset =utf-8") ;
  359. $lunar=new Lunar();//
  360. $month=$lunar->convertSolarToLunar(2013,07,08);//양력을 음력으로 변환
  361. echo '
     ';
  362. print_r($month);
코드 복사
결과 인쇄:
정렬 ( [0] => 2013년 [1] => 5월 [2] => 30 [3] => 귀시 [4] => 5 [5] => 30 [6] => 뱀 [7] => 0 )

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