加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php实现的农历算法实例

发布时间:2020-12-13 02:49:32 所属栏目:PHP教程 来源:网络整理
导读:《php实现的农历算法实例》要点: 本文介绍了php实现的农历算法实例,希望对您有用。如果有疑问,可以联系我们。 本篇章节讲解php实现的农历算法.供大家参考研究.具体如下: PHP学习 ?phpfunction lunarcalendar ($month,$year){ global $lnlunarcal

《php实现的农历算法实例》要点:
本文介绍了php实现的农历算法实例,希望对您有用。如果有疑问,可以联系我们。

本篇章节讲解php实现的农历算法.分享给大家供大家参考.具体如下:PHP学习

<?php
function lunarcalendar ($month,$year)
{
 global $lnlunarcalendar;
 /**
 * Lunar calendar 博大精深的农历
 * 原始数据和算法思路来自 S&S
 */
 /*
 农历每月的天数.
 每个元素为一年.每个元素中的数据为:
 [0]是闰月在哪个月,0为无闰月;
 [1]到[13]是每年12或13个月的每月天数;
 [14]是当年的天干次序,[15]是当年的地支次序
 */
 $everymonth = array(
 0 => array(8,29,30,7,1),1 => array(0,8,2),2 => array(0,9,3),3 => array(5,10,4),4 => array(0,1,5),5 => array(0,2,6),6 => array(4,3,7),7 => array(0,4,8),8 => array(0,5,9),9 => array(2,6,10),10 => array(0,11),11 => array(6,12),12 => array(0,13 => array(0,14 => array(5,15 => array(0,16 => array(0,17 => array(2,18 => array(0,19 => array(7,20 => array(0,21 => array(0,22 => array(5,23 => array(0,24 => array(0,25 => array(4,26 => array(0,27 => array(0,28 => array(2,29 => array(0,30 => array(6,31 => array(0,32 => array(0,33 => array(5,34 => array(0,35 => array(0,36 => array(3,37 => array(0,38 => array(7,39 => array(0,40 => array(0,41 => array(6,42 => array(0,43 => array(0,44 => array(4,45 => array(0,46 => array(0,47 => array(2,48 => array(0,49 => array(7,50 => array(0,51 => array(0,52 => array(5,53 => array(0,54 => array(0,55 => array(3,56 => array(0,57 => array(8,58 => array(0,59 => array(0,60 => array(6,61 => array(0,62 => array(0,63 => array(4,64 => array(0,65 => array(0,66 => array(3,67 => array(0,68 => array(7,69 => array(0,70 => array(0,71 => array(5,72 => array(0,73 => array(0,74 => array(4,75 => array(0,76 => array(8,77 => array(0,78 => array(0,79 => array(6,80 => array(0,81 => array(0,82 => array(4,83 => array(0,84 => array(10,85 => array(0,86 => array(0,87 => array(6,88 => array(0,89 => array(0,90 => array(5,91 => array(0,92 => array(0,93 => array(3,94 => array(0,95 => array(8,96 => array(0,97 => array(0,98 => array(5,99 => array(0,100 => array(0,101 => array(4,102 => array(0,103 => array(0,104 => array(2,105 => array(0,106 => array(7,107 => array(0,108 => array(0,109 => array(5,110 => array(0,111 => array(0,112 => array(4,113 => array(0,114 => array(9,115 => array(0,116 => array(0,117 => array(6,118 => array(0,119 => array(0,120 => array(4,1)
 );
 $mten = $lnlunarcalendar['tiangan'];// 农历天干
 $mtwelve = $lnlunarcalendar['dizhi'];// 农历地支
 $mmonth = $lnlunarcalendar['month'];// 农历月份
 $mday = $lnlunarcalendar['day'];// 农历日
 // 阳历总天数 至1900年12月21日
 $total = 69 * 365 + 17 + 11;
 //1970年1月1日前的就不算了
 if ($year == "" || $month == "" || ($year < 1970 or $year > 2020)) return ''; //超出这个范围不计算
 // 计算到所求日期阳历的总天数-自1900年12月21日始
 for ($y = 1970; $y < $year;$y++) {// 先算年的和
 $total += 365;
 if ($y % 4 == 0) $total ++;
 }
 // 再加当年的几个月
 $total += gmdate("z",gmmktime(0,$month,$year));
 // 用农历的天数累加来判断是否超过阳历的天数
 $flag1 = 0; //判断跳出循环的条件
 $lcj = 0;
 while ($lcj <= 120) {
 $lci = 1;
 while ($lci <= 13) {
  @$mtotal += $everymonth[$lcj][$lci];
  if ($mtotal >= $total) {
  $flag1 = 1;
  break;
  }
  $lci++;
 }
 if ($flag1 == 1) break;
 $lcj++;
 }
 // 由上,得到的 $lci 为当前农历月,$lcj 为当前农历年
 // 计算所求月份1号的农历日期
 $fisrtdaylunar = $everymonth[$lcj][$lci] - ($mtotal - $total);
 $results['year'] = $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj][15]]; //当前是什么年
 $daysthismonth = gmdate("t",$year)); //当前月共几天
 $op = 1;
 for ($i = 1; $i <= $daysthismonth; $i++) {
 $possiblelunarday = $fisrtdaylunar + $op-1; //理论上叠加后的农历日
 if ($possiblelunarday <= $everymonth[$lcj][$lci]) { // 在本月的天数范畴内
  $results[$i] = $mday[$possiblelunarday];
  $op += 1;
 }
 else { // 不在本月的天数范畴内
  $results[$i] = $mday[1]; //退回到1日
  $fisrtdaylunar = 1;
  $op = 2;
  $curmonthnum = ($everymonth[$lcj][0] != 0) ? 13 : 12; //当年有几个月
  if ($lci + 1 > $curmonthnum) { // 第13/14个月了,转到下一年
  $lci = 1;
  $lcj = $lcj + 1;
  // 换年头了,把新一年的天干地支也写上
  $results['year'] .= '/' . $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj][15]];
  }
  else { // 还在这年里
  $lci = $lci + 1;
  $lcj = $lcj;
  }
 }
 if ($results[$i] == $mday[1]) { // 每月的初一应该显示当月是什么月
  if ($everymonth[$lcj][0] != 0) { // 有闰月的年
  $monthss = ($lci > $everymonth[$lcj][0]) ? ($lci-1) : $lci; //闰月后的月数-1
  if ($lci == $everymonth[$lcj][0] + 1) { // 这个月正好是闰月
   $monthssshow = $mmonth[0] . $mmonth[$monthss]; //前面加个闰字
   $runyue = 1;
  }
  else {
   $monthssshow = $mmonth[$monthss];
  }
  }
  else {
  $monthss = $lci;
  $monthssshow = $mmonth[$monthss];
  }
  if ($monthss <= 10 && @$runyue != 1){ //只有1个字的月加上‘月'字
  $monthssshow .= $mmonth[13];
  }
  $results[$i] = $monthssshow;
 }
 }
 return $results;
}
// 忘了加上这个:农历用字
$lnlunarcalendar = array(
 'tiangan' => array("未知","甲","乙","丙","丁","戊","己","庚","辛","壬","癸"),'dizhi' => array("未知","子年(鼠)","丑年(牛)","寅年(虎)","卯年(兔)","辰年(龙)","巳年(蛇)","午年(马)","未年(羊)","申年(猴)","酉年(鸡)","戌年(狗)","亥年(猪)"),'month' => array("闰","正","二","三","四","五","六","七","八","九","十","十一","十二","月"),'day' => array("未知","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十","十三","十四","十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十")
);
print_r(lunarcalendar(8,2015));

运行结果如下:

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

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

《php实现的农历算法实例》是否对您有启发,欢迎查看更多与《php实现的农历算法实例》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读