当前位置:首页 > PHP教程 > php高级应用 > 列表

php实现的农历算法实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-16 11:03:23 浏览: 评论:0 

这篇文章主要介绍了php实现的农历算法,较为详细的分析了农历算法的原理与php实现技巧,非常具有实用价值,需要的朋友可以参考下,本文实例讲述了php实现的农历算法,分享给大家供大家参考,具体如下:

  1. <?php 
  2. function lunarcalendar ($month$year
  3.  global $lnlunarcalendar
  4.  /** 
  5.  * Lunar calendar 博大精深的农历 
  6.  * 原始数据和算法思路来自 S&S 
  7.  */ 
  8.  /* 
  9.  农历每月的天数。 
  10.  每个元素为一年。每个元素中的数据为: 
  11.  [0]是闰月在哪个月,0为无闰月; 
  12.  [1]到[13]是每年12或13个月的每月天数; 
  13.  [14]是当年的天干次序, 
  14.  [15]是当年的地支次序 
  15.  */ 
  16.  $everymonth = array
  17.  0 => array(8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 7, 1), 
  18.  1 => array(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 8, 2), 
  19.  2 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 9, 3), 
  20.  3 => array(5, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 10, 4), 
  21.  4 => array(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 1, 5), 
  22.  5 => array(0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 2, 6), 
  23.  6 => array(4, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 30, 3, 7), 
  24.  7 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 4, 8), 
  25.  8 => array(0, 30, 29, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 5, 9), 
  26.  9 => array(2, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 6, 10), 
  27.  10 => array(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 0, 7, 11), 
  28.  11 => array(6, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 8, 12), 
  29.  12 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 9, 1), 
  30.  13 => array(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 10, 2), 
  31.  14 => array(5, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 1, 3), 
  32.  15 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 2, 4), 
  33.  16 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 3, 5), 
  34.  17 => array(2, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 4, 6), 
  35.  18 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 5, 7), 
  36.  19 => array(7, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 6, 8), 
  37.  20 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 7, 9), 
  38.  21 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 8, 10), 
  39.  22 => array(5, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 9, 11), 
  40.  23 => array(0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 10, 12), 
  41.  24 => array(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 1, 1), 
  42.  25 => array(4, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 2, 2), 
  43.  26 => array(0, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 3, 3), 
  44.  27 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 29, 30, 30, 30, 0, 4, 4), 
  45.  28 => array(2, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 5, 5), 
  46.  29 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 6, 6), 
  47.  30 => array(6, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 7, 7), 
  48.  31 => array(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 8), 
  49.  32 => array(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 9, 9), 
  50.  33 => array(5, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 10, 10), 
  51.  34 => array(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 30, 0, 1, 11), 
  52.  35 => array(0, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 2, 12), 
  53.  36 => array(3, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 29, 3, 1), 
  54.  37 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 4, 2), 
  55.  38 => array(7, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 5, 3), 
  56.  39 => array(0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 6, 4), 
  57.  40 => array(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 7, 5), 
  58.  41 => array(6, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 8, 6), 
  59.  42 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 9, 7), 
  60.  43 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 10, 8), 
  61.  44 => array(4, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 1, 9), 
  62.  45 => array(0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 2, 10), 
  63.  46 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 3, 11), 
  64.  47 => array(2, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 4, 12), 
  65.  48 => array(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 1), 
  66.  49 => array(7, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 6, 2), 
  67.  50 => array(0, 29, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 0, 7, 3), 
  68.  51 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 0, 8, 4), 
  69.  52 => array(5, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 9, 5), 
  70.  53 => array(0, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 29, 0, 10, 6), 
  71.  54 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 1, 7), 
  72.  55 => array(3, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 2, 8), 
  73.  56 => array(0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 3, 9), 
  74.  57 => array(8, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 29, 4, 10), 
  75.  58 => array(0, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 5, 11), 
  76.  59 => array(0, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 0, 6, 12), 
  77.  60 => array(6, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 7, 1), 
  78.  61 => array(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 0, 8, 2), 
  79.  62 => array(0, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 9, 3), 
  80.  63 => array(4, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 10, 4), 
  81.  64 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 0, 1, 5), 
  82.  65 => array(0, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 0, 2, 6), 
  83.  66 => array(3, 30, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 3, 7), 
  84.  67 => array(0, 30, 30, 29, 30, 30, 29, 29, 30, 29, 30, 29, 30, 0, 4, 8), 
  85.  68 => array(7, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 5, 9), 
  86.  69 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 6, 10), 
  87.  70 => array(0, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 0, 7, 11), 
  88.  71 => array(5, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 29, 30, 8, 12), 
  89.  72 => array(0, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 0, 9, 1), 
  90.  73 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 0, 10, 2), 
  91.  74 => array(4, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 1, 3), 
  92.  75 => array(0, 30, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 0, 2, 4), 
  93.  76 => array(8, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 3, 5), 
  94.  77 => array(0, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 29, 0, 4, 6), 
  95.  78 => array(0, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 5, 7), 
  96.  79 => array(6, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 6, 8), 
  97.  80 => array(0, 30, 29, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 0, 7, 9), 
  98.  81 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 0, 8, 10), 
  99.  82 => array(4, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 9, 11), 
  100.  83 => array(0, 30, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 10, 12), 
  101.  84 => array(10, 30, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 1, 1), 
  102.  85 => array(0, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 2, 2), 
  103.  86 => array(0, 29, 30, 30, 29, 30, 30, 29, 30, 29, 30, 29, 29, 0, 3, 3), 
  104.  87 => array(6, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 30, 29, 29, 4, 4), 
  105.  88 => array(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 5, 5), 
  106.  89 => array(0, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 30, 0, 6, 6), 
  107.  90 => array(5, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 30, 7, 7), 
  108.  91 => array(0, 29, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 0, 8, 8), 
  109.  92 => array(0, 29, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 0, 9, 9), 
  110.  93 => array(3, 29, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 10, 10), 
  111.  94 => array(0, 30, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 0, 1, 11), 
  112.  95 => array(8, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 30, 29, 30, 2, 12), 
  113.  96 => array(0, 29, 30, 29, 30, 30, 29, 30, 29, 30, 30, 29, 29, 0, 3, 1), 
  114.  97 => array(0, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 29, 0, 4, 2), 
  115.  98 => array(5, 30, 29, 29, 30, 29, 29, 30, 30, 29, 30, 30, 29, 30, 5, 3), 
  116.  99 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 0, 6, 4), 
  117.  100 => array(0, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 0, 7, 5), 
  118.  101 => array(4, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 8, 6), 
  119.  102 => array(0, 30, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 9, 7), 
  120.  103 => array(0, 30, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 0, 10, 8), 
  121.  104 => array(2, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 1, 9), 
  122.  105 => array(0, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 0, 2, 10), 
  123.  106 => array(7, 30, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 30, 3, 11), 
  124.  107 => array(0, 29, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 0, 4, 12), 
  125.  108 => array(0, 30, 29, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 0, 5, 1), 
  126.  109 => array(5, 30, 30, 29, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 6, 2), 
  127.  110 => array(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 0, 7, 3), 
  128.  111 => array(0, 30, 29, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 0, 8, 4), 
  129.  112 => array(4, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 29, 30, 29, 9, 5), 
  130.  113 => array(0, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 29, 30, 0, 10, 6), 
  131.  114 => array(9, 29, 30, 29, 30, 29, 30, 29, 30, 30, 29, 30, 29, 30, 1, 7), 
  132.  115 => array(0, 29, 30, 29, 29, 30, 29, 30, 30, 30, 29, 30, 29, 0, 2, 8), 
  133.  116 => array(0, 30, 29, 30, 29, 29, 30, 29, 30, 30, 29, 30, 30, 0, 3, 9), 
  134.  117 => array(6, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 30, 4, 10), 
  135.  118 => array(0, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 30, 0, 5, 11), 
  136.  119 => array(0, 30, 29, 30, 29, 30, 29, 29, 30, 29, 29, 30, 30, 0, 6, 12), 
  137.  120 => array(4, 29, 30, 30, 30, 29, 30, 29, 29, 30, 29, 30, 29, 30, 7, 1) 
  138.  ); 
  139.  $mten = $lnlunarcalendar['tiangan'];// 农历天干 
  140.  $mtwelve = $lnlunarcalendar['dizhi'];// 农历地支 
  141.  $mmonth = $lnlunarcalendar['month'];// 农历月份 
  142.  $mday = $lnlunarcalendar['day'];// 农历日 
  143.  // 阳历总天数 至1900年12月21日 
  144.  $total = 69 * 365 + 17 + 11; 
  145.  //1970年1月1日前的就不算了 
  146.  if ($year == "" || $month == "" || ($year < 1970 or $year > 2020)) return ''//超出这个范围不计算 
  147.  // 计算到所求日期阳历的总天数-自1900年12月21日始 
  148.  for ($y = 1970; $y < $year;$y++) {// 先算年的和 
  149.  $total += 365; 
  150.  if ($y % 4 == 0) $total ++; 
  151.  } 
  152.  // 再加当年的几个月 
  153.  $total += gmdate("z"gmmktime(0, 0, 0, $month, 1, $year)); 
  154.  // 用农历的天数累加来判断是否超过阳历的天数 
  155.  $flag1 = 0; //判断跳出循环的条件 
  156.  $lcj = 0; 
  157.  while ($lcj <= 120) { 
  158.  $lci = 1; 
  159.  while ($lci <= 13) { 
  160.   @$mtotal += $everymonth[$lcj][$lci]; 
  161.   if ($mtotal >= $total) { 
  162.   $flag1 = 1; 
  163.   break
  164.   } 
  165.   $lci++; 
  166.  } 
  167.  if ($flag1 == 1) break
  168.  $lcj++; 
  169.  } 
  170.  // 由上,得到的 $lci 为当前农历月, $lcj 为当前农历年 
  171.  // 计算所求月份1号的农历日期 
  172.  $fisrtdaylunar = $everymonth[$lcj][$lci] - ($mtotal - $total); 
  173.  $results['year'] = $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj][15]]; //当前是什么年 
  174.  $daysthismonth = gmdate("t"gmmktime(0, 0, 0, $month, 1, $year)); //当前月共几天 
  175.  $op = 1; 
  176.  for ($i = 1; $i <= $daysthismonth$i++) { 
  177.  $possiblelunarday = $fisrtdaylunar + $op-1; //理论上叠加后的农历日 
  178.  if ($possiblelunarday <= $everymonth[$lcj][$lci]) { // 在本月的天数范畴内 
  179.   $results[$i] = $mday[$possiblelunarday]; 
  180.   $op += 1; 
  181.  } 
  182.  else { // 不在本月的天数范畴内 
  183.   $results[$i] = $mday[1]; //退回到1日 
  184.   $fisrtdaylunar = 1; 
  185.   $op = 2; 
  186.   $curmonthnum = ($everymonth[$lcj][0] != 0) ? 13 : 12; //当年有几个月 
  187.   if ($lci + 1 > $curmonthnum) { // 第13/14个月了,转到下一年 
  188.   $lci = 1; 
  189.   $lcj = $lcj + 1; 
  190.   // 换年头了,把新一年的天干地支也写上 
  191.   $results['year'] .= '/' . $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj][15]]; 
  192.   } 
  193.   else { // 还在这年里 
  194.   $lci = $lci + 1; 
  195.   $lcj = $lcj
  196.   } 
  197.  } 
  198.  if ($results[$i] == $mday[1]) { // 每月的初一应该显示当月是什么月 
  199.   if ($everymonth[$lcj][0] != 0) { // 有闰月的年 
  200.   $monthss = ($lci > $everymonth[$lcj][0]) ? ($lci-1) : $lci//闰月后的月数-1 
  201.   if ($lci == $everymonth[$lcj][0] + 1) { // 这个月正好是闰月 
  202.    $monthssshow = $mmonth[0] . $mmonth[$monthss]; //前面加个闰字 
  203.    $runyue = 1; 
  204.   } 
  205.   else { 
  206.    $monthssshow = $mmonth[$monthss]; 
  207.   } 
  208.   } 
  209.   else { 
  210.   $monthss = $lci
  211.   $monthssshow = $mmonth[$monthss]; 
  212.   } 
  213.   if ($monthss <= 10 && @$runyue != 1){ //只有1个字的月加上‘月'字 
  214.   $monthssshow .= $mmonth[13]; 
  215.   } 
  216.   $results[$i] = $monthssshow
  217.  } 
  218.  } 
  219.  return $results
  220. // 忘了加上这个:农历用字 
  221. $lnlunarcalendar = array
  222.  'tiangan' => array("未知""甲""乙""丙""丁""戊""己""庚""辛""壬""癸"), 
  223.  'dizhi' => array("未知""子年(鼠)""丑年(牛)""寅年(虎)""卯年(兔)""辰年(龙)"
  224.  "巳年(蛇)""午年(马)""未年(羊)""申年(猴)""酉年(鸡)""戌年(狗)""亥年(猪)"), 
  225.  'month' => array("闰""正""二""三""四""五""六"
  226.  "七""八""九""十""十一""十二""月"), 
  227.  'day' => array("未知""初一""初二""初三""初四""初五""初六""初七""初八""初九""初十"
  228.  "十一""十二""十三""十四""十五""十六""十七""十八""十九""二十"
  229.  "廿一""廿二""廿三""廿四""廿五""廿六""廿七""廿八""廿九""三十"
  230. ); 
  231. print_r(lunarcalendar(8,2015)); 

运行结果如下:

  1. Array 
  2.   [year] => 乙未年(羊) 
  3.   [1] => 十七 
  4.   [2] => 十八 
  5.   [3] => 十九 
  6.   [4] => 二十 
  7.   [5] => 廿一 
  8.   [6] => 廿二 
  9.   [7] => 廿三 
  10.   [8] => 廿四 
  11.   [9] => 廿五 
  12.   [10] => 廿六 
  13.   [11] => 廿七 
  14.   [12] => 廿八 
  15.   [13] => 廿九 
  16.   [14] => 七月 
  17.   [15] => 初二 
  18.   [16] => 初三 
  19.   [17] => 初四 
  20.   [18] => 初五 
  21.   [19] => 初六 
  22.   [20] => 初七 
  23.   [21] => 初八 
  24.   [22] => 初九 
  25.   [23] => 初十 
  26.   [24] => 十一 
  27.   [25] => 十二 
  28.   [26] => 十三 
  29.   [27] => 十四 
  30.   [28] => 十五 
  31.   [29] => 十六 
  32.   [30] => 十七 
  33.   [31] => 十八 

希望本文所述对大家的php程序设计有所帮助。

Tags: php农历算法

分享到: