温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php如何实现农历算法

发布时间:2021-06-25 14:08:51 阅读:233 作者:小新 栏目:开发技术
PHP开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

小编给大家分享一下php如何实现农历算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

具体如下:

<?php
function lunarcalendar ($month$year)
{
 global $lnlunarcalendar;
 /**
 * Lunar calendar 博大精深的农历
 * 原始数据和算法思路来自 S&S
 */
 /*
 农历每月的天数。
 每个元素为一年。每个元素中的数据为:
 [0]是闰月在哪个月,0为无闰月;
 [1]到[13]是每年12或13个月的每月天数;
 [14]是当年的天干次序,
 [15]是当年的地支次序
 */
 $everymonth array(
 0 => array(800000000000293071),
 1 => array(0293029293029302930303029082),
 2 => array(0302930292930293029303030093),
 3 => array(529302930292930292930302930104),
 4 => array(0303029302929302929303029015),
 5 => array(0303029303029293029302930026),
 6 => array(42930302930293029302930293037),
 7 => array(0293029302930302930293029048),
 8 => array(0302929303029302930302930059),
 9 => array(229302929302930293030302930610),
 10 => array(02930292930293029303030290711),
 11 => array(630293029293029293030293030812),
 12 => array(0302930292930292930302930091),
 13 => array(03030293029293029293029300102),
 14 => array(53030293029302930293029293013),
 15 => array(0302930302930293029302930024),
 16 => array(0293029302930302930293029035),
 17 => array(23029293029303029303029302946),
 18 => array(0302929302930293030293030057),
 19 => array(72930292930292930302930303068),
 20 => array(0293029293029293030293030079),
 21 => array(03029302929302929302930300810),
 22 => array(530293030292930292930293030911),
 23 => array(029303029302930292930293001012),
 24 => array(0293030293030293029302929011),
 25 => array(43029302930302930302930293022),
 26 => array(0292930293029303029303029033),
 27 => array(0302929302930293029303030044),
 28 => array(22930292930292930293030303055),
 29 => array(0293029293029293029303030066),
 30 => array(62930302929302929302930302977),
 31 => array(0303029302930292930293029088),
 32 => array(0303030293029302929302930099),
 33 => array(5293030293030293029302929301010),
 34 => array(02930293030293029303029300111),
 35 => array(02929302930293030293030290212),
 36 => array(33029293029293030293030302931),
 37 => array(0302929302929302930303029042),
 38 => array(73030292930292930293030293053),
 39 => array(0303029293029293029302930064),
 40 => array(0303029302930292930293029075),
 41 => array(63030293030293029293029302986),
 42 => array(0302930302930293029302930097),
 43 => array(02930293029303029302930290108),
 44 => array(43029302930293029303029303019),
 45 => array(02929302929302930303029300210),
 46 => array(03029293029293029303029300311),
 47 => array(230302929302929302930293030412),
 48 => array(0302930293029293029302930051),
 49 => array(73029303029302929302930293062),
 50 => array(0293030293030292930293029073),
 51 => array(0302930302930293029302930084),
 52 => array(52930293029302930302930293095),
 53 => array(02930292930302930302930290106),
 54 => array(0302930292930293030293030017),
 55 => array(32930293029293029302930303028),
 56 => array(0293029302929302930293030039),
 57 => array(830293029302929302930293029410),
 58 => array(03030302930292930293029300511),
 59 => array(02930302930293029302930290612),
 60 => array(63029302930302930293029302971),
 61 => array(0302930293029303029302930082),
 62 => array(0293029293029303029303029093),
 63 => array(430293029293029302930303029104),
 64 => array(0302930292930293029303030015),
 65 => array(0293029302929302929303029026),
 66 => array(33030302930292930292930302937),
 67 => array(0303029303029293029302930048),
 68 => array(72930293030293029302930293059),
 69 => array(02930293029303029302930290610),
 70 => array(03029293029303029303029300711),
 71 => array(529302929302930293030302930812),
 72 => array(0293029293029302930302930091),
 73 => array(03029302929302929303029300102),
 74 => array(43030293029293029293030293013),
 75 => array(0303029302929302929302930024),
 76 => array(83030293029302930292930293035),
 77 => array(0302930302930293029302929046),
 78 => array(0302930302930302930293029057),
 79 => array(63029293029303029303029302968),
 80 => array(0302929302930293030293030079),
 81 => array(02930292930292930302930300810),
 82 => array(430293029293029293029303030911),
 83 => array(030293029293029293029303001012),
 84 => array(103029303029293029293029303011),
 85 => array(0293030293029302929302930022),
 86 => array(0293030293030293029302929033),
 87 => array(63029302930302930302930292944),
 88 => array(0302930293029303029303029055),
 89 => array(0302929302929303029303030066),
 90 => array(52930292930292930293030303077),
 91 => array(0293029293029293029303030088),
 92 => array(0293030292930292930293030099),
 93 => array(3293030293029302929302930291010),
 94 => array(03030302930293029293029300111),
 95 => array(829303029302930302929302930212),
 96 => array(0293029303029302930302929031),
 97 => array(0302930293029303029303029042),
 98 => array(53029293029293030293030293053),
 99 => array(0302929302929302930303029064),
 100 => array(0303029293029293029303029075),
 101 => array(43030293029302929302930293086),
 102 => array(0303029302930292930293029097),
 103 => array(03030293030293029293029300108),
 104 => array(22930293030293029302930293019),
 105 => array(02930293029303029302930290210),
 106 => array(730293029302930293030293030311),
 107 => array(02929302929302930303029300412),
 108 => array(0302929302929302930302930051),
 109 => array(53030292930292930293029303062),
 110 => array(0302930293029293029302930073),
 111 => array(0302930302930292930293029084),
 112 => array(43029303029302930293029302995),
 113 => array(03029302930302930293029300106),
 114 => array(92930293029302930302930293017),
 115 => array(0293029293029303030293029028),
 116 => array(0302930292930293030293030039),
 117 => array(629302930292930293029303030410),
 118 => array(02930293029293029302930300511),
 119 => array(03029302930292930292930300612),
 120 => array(42930303029302929302930293071)
 );
 $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(000$month1$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 == 1break;
 $lcj++;
 }
 // 由上,得到的 $lci 为当前农历月, $lcj 为当前农历年
 // 计算所求月份1号的农历日期
 $fisrtdaylunar $everymonth[$lcj][$lci] - ($mtotal $total);
 $results['year'] = $mten[$everymonth[$lcj][14]] . $mtwelve[$everymonth[$lcj][15]]; //当前是什么年
 $daysthismonth gmdate("t"gmmktime(000$month1$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如何实现农历算法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI

开发者交流群×