如何用PHP开发一个奇门遁甲排盘程序(一)

首先要将公历转为干支历,我在网上找了一段代码,能麻烦别人的事,绝对不辛苦自己。

  1 <?php
  2 
  3 class Lunar
  4 
  5 {
  6 
  7 /**
  8 
  9 * Created by 闻海南.
 10 
 11 * User: timeless
 12 
 13 * Date: 2018-5-29
 14 
 15 * Time: 上午9:32s
 16 
 17 */
 18 
 19 var $MIN_YEAR = 1891;
 20 
 21 var $MAX_YEAR = 2100;
 22 
 23 var $lunarInfo = array(
 24 
 25 array(0, 2, 9, 21936), array(6, 1, 30, 9656), array(0, 2, 17, 9584), array(0, 2, 6, 21168), array(5, 1, 26, 43344), array(0, 2, 13, 59728),
 26 
 27 array(0, 2, 2, 27296), array(3, 1, 22, 44368), array(0, 2, 10, 43856), array(8, 1, 30, 19304), array(0, 2, 19, 19168), array(0, 2, 8, 42352),
 28 
 29 array(5, 1, 29, 21096), array(0, 2, 16, 53856), array(0, 2, 4, 55632), array(4, 1, 25, 27304), array(0, 2, 13, 22176), array(0, 2, 2, 39632),
 30 
 31 array(2, 1, 22, 19176), array(0, 2, 10, 19168), array(6, 1, 30, 42200), array(0, 2, 18, 42192), array(0, 2, 6, 53840), array(5, 1, 26, 54568),
 32 
 33 array(0, 2, 14, 46400), array(0, 2, 3, 54944), array(2, 1, 23, 38608), array(0, 2, 11, 38320), array(7, 2, 1, 18872), array(0, 2, 20, 18800),
 34 
 35 array(0, 2, 8, 42160), array(5, 1, 28, 45656), array(0, 2, 16, 27216), array(0, 2, 5, 27968), array(4, 1, 24, 44456), array(0, 2, 13, 11104),
 36 
 37 array(0, 2, 2, 38256), array(2, 1, 23, 18808), array(0, 2, 10, 18800), array(6, 1, 30, 25776), array(0, 2, 17, 54432), array(0, 2, 6, 59984),
 38 
 39 array(5, 1, 26, 27976), array(0, 2, 14, 23248), array(0, 2, 4, 11104), array(3, 1, 24, 37744), array(0, 2, 11, 37600), array(7, 1, 31, 51560),
 40 
 41 array(0, 2, 19, 51536), array(0, 2, 8, 54432), array(6, 1, 27, 55888), array(0, 2, 15, 46416), array(0, 2, 5, 22176), array(4, 1, 25, 43736),
 42 
 43 array(0, 2, 13, 9680), array(0, 2, 2, 37584), array(2, 1, 22, 51544), array(0, 2, 10, 43344), array(7, 1, 29, 46248), array(0, 2, 17, 27808),
 44 
 45 array(0, 2, 6, 46416), array(5, 1, 27, 21928), array(0, 2, 14, 19872), array(0, 2, 3, 42416), array(3, 1, 24, 21176), array(0, 2, 12, 21168),
 46 
 47 array(8, 1, 31, 43344), array(0, 2, 18, 59728), array(0, 2, 8, 27296), array(6, 1, 28, 44368), array(0, 2, 15, 43856), array(0, 2, 5, 19296),
 48 
 49 array(4, 1, 25, 42352), array(0, 2, 13, 42352), array(0, 2, 2, 21088), array(3, 1, 21, 59696), array(0, 2, 9, 55632), array(7, 1, 30, 23208),
 50 
 51 array(0, 2, 17, 22176), array(0, 2, 6, 38608), array(5, 1, 27, 19176), array(0, 2, 15, 19152), array(0, 2, 3, 42192), array(4, 1, 23, 53864),
 52 
 53 array(0, 2, 11, 53840), array(8, 1, 31, 54568), array(0, 2, 18, 46400), array(0, 2, 7, 46752), array(6, 1, 28, 38608), array(0, 2, 16, 38320),
 54 
 55 array(0, 2, 5, 18864), array(4, 1, 25, 42168), array(0, 2, 13, 42160), array(10, 2, 2, 45656), array(0, 2, 20, 27216), array(0, 2, 9, 27968),
 56 
 57 array(6, 1, 29, 44448), array(0, 2, 17, 43872), array(0, 2, 6, 38256), array(5, 1, 27, 18808), array(0, 2, 15, 18800), array(0, 2, 4, 25776),
 58 
 59 array(3, 1, 23, 27216), array(0, 2, 10, 59984), array(8, 1, 31, 27432), array(0, 2, 19, 23232), array(0, 2, 7, 43872), array(5, 1, 28, 37736),
 60 
 61 array(0, 2, 16, 37600), array(0, 2, 5, 51552), array(4, 1, 24, 54440), array(0, 2, 12, 54432), array(0, 2, 1, 55888), array(2, 1, 22, 23208),
 62 
 63 array(0, 2, 9, 22176), array(7, 1, 29, 43736), array(0, 2, 18, 9680), array(0, 2, 7, 37584), array(5, 1, 26, 51544), array(0, 2, 14, 43344),
 64 
 65 array(0, 2, 3, 46240), array(4, 1, 23, 46416), array(0, 2, 10, 44368), array(9, 1, 31, 21928), array(0, 2, 19, 19360), array(0, 2, 8, 42416),
 66 
 67 array(6, 1, 28, 21176), array(0, 2, 16, 21168), array(0, 2, 5, 43312), array(4, 1, 25, 29864), array(0, 2, 12, 27296), array(0, 2, 1, 44368),
 68 
 69 array(2, 1, 22, 19880), array(0, 2, 10, 19296), array(6, 1, 29, 42352), array(0, 2, 17, 42208), array(0, 2, 6, 53856), array(5, 1, 26, 59696),
 70 
 71 array(0, 2, 13, 54576), array(0, 2, 3, 23200), array(3, 1, 23, 27472), array(0, 2, 11, 38608), array(11, 1, 31, 19176), array(0, 2, 19, 19152),
 72 
 73 array(0, 2, 8, 42192), array(6, 1, 28, 53848), array(0, 2, 15, 53840), array(0, 2, 4, 54560), array(5, 1, 24, 55968), array(0, 2, 12, 46496),
 74 
 75 array(0, 2, 1, 22224), array(2, 1, 22, 19160), array(0, 2, 10, 18864), array(7, 1, 30, 42168), array(0, 2, 17, 42160), array(0, 2, 6, 43600),
 76 
 77 array(5, 1, 26, 46376), array(0, 2, 14, 27936), array(0, 2, 2, 44448), array(3, 1, 23, 21936), array(0, 2, 11, 37744), array(8, 2, 1, 18808),
 78 
 79 array(0, 2, 19, 18800), array(0, 2, 8, 25776), array(6, 1, 28, 27216), array(0, 2, 15, 59984), array(0, 2, 4, 27424), array(4, 1, 24, 43872),
 80 
 81 array(0, 2, 12, 43744), array(0, 2, 2, 37600), array(3, 1, 21, 51568), array(0, 2, 9, 51552), array(7, 1, 29, 54440), array(0, 2, 17, 54432),
 82 
 83 array(0, 2, 5, 55888), array(5, 1, 26, 23208), array(0, 2, 14, 22176), array(0, 2, 3, 42704), array(4, 1, 23, 21224), array(0, 2, 11, 21200),
 84 
 85 array(8, 1, 31, 43352), array(0, 2, 19, 43344), array(0, 2, 7, 46240), array(6, 1, 27, 46416), array(0, 2, 15, 44368), array(0, 2, 5, 21920),
 86 
 87 array(4, 1, 24, 42448), array(0, 2, 12, 42416), array(0, 2, 2, 21168), array(3, 1, 22, 43320), array(0, 2, 9, 26928), array(7, 1, 29, 29336),
 88 
 89 array(0, 2, 17, 27296), array(0, 2, 6, 44368), array(5, 1, 26, 19880), array(0, 2, 14, 19296), array(0, 2, 3, 42352), array(4, 1, 24, 21104),
 90 
 91 array(0, 2, 10, 53856), array(8, 1, 30, 59696), array(0, 2, 18, 54560), array(0, 2, 7, 55968), array(6, 1, 27, 27472), array(0, 2, 15, 22224),
 92 
 93 array(0, 2, 5, 19168), array(4, 1, 25, 42216), array(0, 2, 12, 42192), array(0, 2, 1, 53584), array(2, 1, 21, 55592), array(0, 2, 9, 54560)
 94 
 95 );
 96 
 97 /**
 98 
 99 * 将阳历转换为阴历
100 
101 * @param year 公历-年
102 
103 * @param month 公历-月
104 
105 * @param date 公历-日
106 
107 */
108 
109 function convertSolarToLunar($year, $month, $date)
110 
111 {//debugger;
112 
113 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
114 
115 if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {
116 
117 return array(1891, '正月', '初一', '辛卯', 1, 1, '兔');
118 
119 }
120 
121 return $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $date, $yearData[1], $yearData[2]));
122 
123 }
124 
125 function convertSolarMonthToLunar($year, $month)
126 
127 {
128 
129 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
130 
131 if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {
132 
133 return array(1891, '正月', '初一', '辛卯', 1, 1, '兔');
134 
135 }
136 
137 $month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
138 
139 $dd = $month_days_ary[$month];
140 
141 if ($this->isLeapYear($year) && $month == 2) $dd++;
142 
143 $lunar_ary = array();
144 
145 for ($i = 1; $i < $dd; $i++) {
146 
147 $array = $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $i, $yearData[1], $yearData[2]));
148 
149 $array[] = $year . '-' . $month . '-' . $i;
150 
151 $lunar_ary[$i] = $array;
152 
153 }
154 
155 return $lunar_ary;
156 
157 }
158 
159 /**
160 
161 * 将阴历转换为阳历
162 
163 * @param year 阴历-年
164 
165 * @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0
166 
167 * @param date 阴历-日
168 
169 */
170 
171 function convertLunarToSolar($year, $month, $date)
172 
173 {
174 
175 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
176 
177 $between = $this->getDaysBetweenLunar($year, $month, $date);
178 
179 $res = mktime(0, 0, 0, $yearData[1], $yearData[2], $year);
180 
181 $res = date('Y-m-d', $res + $between * 24 * 60 * 60);
182 
183 $day = explode('-', $res);
184 
185 $year = $day[0];
186 
187 $month = $day[1];
188 
189 $day = $day[2];
190 
191 return array($year, $month, $day);
192 
193 }
194 
195 /**
196 
197 * 判断是否是闰年
198 
199 * @param year
200 
201 */
202 
203 function isLeapYear($year)
204 
205 {
206 
207 return (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0));
208 
209 }
210 
211 /**
212 
213 * 获取干支纪年
214 
215 * @param year
216 
217 */
218 
219 function getLunarYearName($year)
220 
221 {
222 
223 $sky = array('庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己');
224 
225 $earth = array('申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未');
226 
227 $year = $year . '';
228 
229 return $sky[$year{3}] . $earth[$year % 12];
230 
231 }
232 
233 /**
234 
235 * 根据阴历年获取生肖
236 
237 * @param year 阴历年
238 
239 */
240 
241 function getYearZodiac($year)
242 
243 {
244 
245 $zodiac = array('猴', '鸡', '狗', '猪', '鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊');
246 
247 return $zodiac[$year % 12];
248 
249 }
250 
251 /**
252 
253 * 获取阳历月份的天数
254 
255 * @param year 阳历-年
256 
257 * @param month 阳历-月
258 
259 */
260 
261 function getSolarMonthDays($year, $month)
262 
263 {
264 
265 $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);
266 
267 return $monthHash["$month"];
268 
269 }
270 
271 /**
272 
273 * 获取阴历月份的天数
274 
275 * @param year 阴历-年
276 
277 * @param month 阴历-月,从一月开始
278 
279 */
280 
281 function getLunarMonthDays($year, $month)
282 
283 {
284 
285 $monthData = $this->getLunarMonths($year);
286 
287 return $monthData[$month - 1];
288 
289 }
290 
291 /**
292 
293 * 获取阴历每月的天数的数组
294 
295 * @param year
296 
297 */
298 
299 function getLunarMonths($year)
300 
301 {
302 
303 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
304 
305 $leapMonth = $yearData[0];
306 
307 $bit = decbin($yearData[3]);
308 
309 for ($i = 0; $i < strlen($bit); $i++) {
310 
311 $bitArray[$i] = substr($bit, $i, 1);
312 
313 }
314 
315 for ($k = 0, $klen = 16 - count($bitArray); $k < $klen; $k++) {
316 
317 array_unshift($bitArray, '0');
318 
319 }
320 
321 $bitArray = array_slice($bitArray, 0, ($leapMonth == 0 ? 12 : 13));
322 
323 for ($i = 0; $i < count($bitArray); $i++) {
324 
325 $bitArray[$i] = $bitArray[$i] + 29;
326 
327 }
328 
329 return $bitArray;
330 
331 }
332 
333 /**
334 
335 * 获取农历每年的天数
336 
337 * @param year 农历年份
338 
339 */
340 
341 function getLunarYearDays($year)
342 
343 {
344 
345 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
346 
347 $monthArray = $this->getLunarYearMonths($year);
348 
349 $len = count($monthArray);
350 
351 return ($monthArray[$len - 1] == 0 ? $monthArray[$len - 2] : $monthArray[$len - 1]);
352 
353 }
354 
355 function getLunarYearMonths($year)
356 
357 {//debugger;
358 
359 $monthData = $this->getLunarMonths($year);
360 
361 $res = array();
362 
363 $temp = 0;
364 
365 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
366 
367 $len = ($yearData[0] == 0 ? 12 : 13);
368 
369 for ($i = 0; $i < $len; $i++) {
370 
371 $temp = 0;
372 
373 for ($j = 0; $j <= $i; $j++) {
374 
375 $temp += $monthData[$j];
376 
377 }
378 
379 array_push($res, $temp);
380 
381 }
382 
383 return $res;
384 
385 }
386 
387 /**
388 
389 * 获取闰月
390 
391 * @param year 阴历年份
392 
393 */
394 
395 function getLeapMonth($year)
396 
397 {
398 
399 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
400 
401 return $yearData[0];
402 
403 }
404 
405 /**
406 
407 * 计算阴历日期与正月初一相隔的天数
408 
409 * @param year
410 
411 * @param month
412 
413 * @param date
414 
415 */
416 
417 function getDaysBetweenLunar($year, $month, $date)
418 
419 {
420 
421 $yearMonth = $this->getLunarMonths($year);
422 
423 $res = 0;
424 
425 for ($i = 1; $i < $month; $i++) {
426 
427 $res += $yearMonth[$i - 1];
428 
429 }
430 
431 $res += $date - 1;
432 
433 return $res;
434 
435 }
436 
437 /**
438 
439 * 计算2个阳历日期之间的天数
440 
441 * @param year 阳历年
442 
443 * @param cmonth
444 
445 * @param cdate
446 
447 * @param dmonth 阴历正月对应的阳历月份
448 
449 * @param ddate 阴历初一对应的阳历天数
450 
451 */
452 
453 function getDaysBetweenSolar($year, $cmonth, $cdate, $dmonth, $ddate)
454 
455 {
456 
457 $a = mktime(0, 0, 0, $cmonth, $cdate, $year);
458 
459 $b = mktime(0, 0, 0, $dmonth, $ddate, $year);
460 
461 return ceil(($a - $b) / 24 / 3600);
462 
463 }
464 
465 /**
466 
467 * 根据距离正月初一的天数计算阴历日期
468 
469 * @param year 阳历年
470 
471 * @param between 天数
472 
473 */
474 
475 function getLunarByBetween($year, $between)
476 
477 {//debugger;
478 
479 $lunarArray = array();
480 
481 $yearMonth = array();
482 
483 $t = 0;
484 
485 $e = 0;
486 
487 $leapMonth = 0;
488 
489 $m = '';
490 
491 if ($between == 0) {
492 
493 array_push($lunarArray, $year, '正月', '初一');
494 
495 $t = 1;
496 
497 $e = 1;
498 
499 } else {
500 
501 $year = $between > 0 ? $year : ($year - 1);
502 
503 $yearMonth = $this->getLunarYearMonths($year);
504 
505 $leapMonth = $this->getLeapMonth($year);
506 
507 $between = $between > 0 ? $between : ($this->getLunarYearDays($year) + $between);
508 
509 for ($i = 0; $i < 13; $i++) {
510 
511 if ($between == $yearMonth[$i]) {
512 
513 $t = $i + 2;
514 
515 $e = 1;
516 
517 break;
518 
519 } else if ($between < $yearMonth[$i]) {
520 
521 $t = $i + 1;
522 
523 $e = $between - (empty($yearMonth[$i - 1]) ? 0 : $yearMonth[$i - 1]) + 1;
524 
525 break;
526 
527 }
528 
529 }
530 
531 $m = ($leapMonth != 0 && $t == $leapMonth + 1) ? ('闰' . $this->getCapitalNum($t - 1, true)) : $this->getCapitalNum(($leapMonth != 0 && $leapMonth + 1 < $t ? ($t - 1) : $t), true);
532 
533 array_push($lunarArray, $year, $m, $this->getCapitalNum($e, false));
534 
535 }
536 
537 array_push($lunarArray, $this->getLunarYearName($year));// 天干地支
538 
539 array_push($lunarArray, $t, $e);
540 
541 array_push($lunarArray, $this->getYearZodiac($year));// 12生肖
542 
543 array_push($lunarArray, $leapMonth);// 闰几月
544 
545 return $lunarArray;
546 
547 }
548 
549 /**
550 
551 * 获取数字的阴历叫法
552 
553 * @param num 数字
554 
555 * @param isMonth 是否是月份的数字
556 
557 */
558 
559 function getCapitalNum($num, $isMonth)
560 
561 {
562 
563 $isMonth = $isMonth || false;
564 
565 $dateHash = array('0' => '', '1' => '一', '2' => '二', '3' => '三', '4' => '四', '5' => '五', '6' => '六', '7' => '七', '8' => '八', '9' => '九', '10' => '十 ');
566 
567 $monthHash = array('0' => '', '1' => '正月', '2' => '二月', '3' => '三月', '4' => '四月', '5' => '五月', '6' => '六月', '7' => '七月', '8' => '八月', '9' => '九月', '10' => '十月', '11' => '冬月', '12' => '腊月');
568 
569 $res = '';
570 
571 if ($isMonth) {
572 
573 $res = $monthHash[$num];
574 
575 } else {
576 
577 if ($num <= 10) {
578 
579 $res = '初' . $dateHash[$num];
580 
581 } else if ($num > 10 && $num < 20) {
582 
583 $res = '十' . $dateHash[$num - 10];
584 
585 } else if ($num == 20) {
586 
587 $res = "二十";
588 
589 } else if ($num > 20 && $num < 30) {
590 
591 $res = "廿" . $dateHash[$num - 20];
592 
593 } else if ($num == 30) {
594 
595 $res = "三十";
596 
597 }
598 
599 }
600 
601 return $res;
602 
603 }
604 
605 /*class end*/
606 
607 }
608 
609 header("Content-Type:text/html;charset=utf-8");
610 
611 $lunar = new Lunar();
612 
613 $month = $lunar->convertSolarToLunar('2017', '03', '09');//将阳历转换为阴历
614 
615 echo '
616 
617 ';
618 print_r($month);

 

posted @ 2022-11-16 22:14  周了个易  阅读(593)  评论(0)    收藏  举报