如何用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);

浙公网安备 33010602011771号