i漂泊

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2504|回复: 0

PHP阳历转农历,2019新春版

[复制链接]
TA的礼物信息
  • 收到:0
  • 送出:2
发表于 2019-1-4 17:18:10 | 显示全部楼层 |阅读模式
  1. <?php

  2. function nongli($riqi)
  3. {
  4. $nian=date('Y',strtotime($riqi));
  5. $yue=date('m',strtotime($riqi));
  6. $ri=date('d',strtotime($riqi));

  7.   #源码部分原作者:沈潋(S&S Lab)
  8.   #农历每月的天数
  9.   $everymonth=array(
  10.                     0=>array(8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1),
  11.                     1=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,8,2),
  12.                     2=>array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,9,3),
  13.                     3=>array(5,29,30,29,30,29,29,30,29,29,30,30,29,30,10,4),
  14.                     4=>array(0,30,30,29,30,29,29,30,29,29,30,30,29,0,1,5),
  15.                     5=>array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,2,6),
  16.                     6=>array(4,29,30,30,29,30,29,30,29,30,29,30,29,30,3,7),
  17.                     7=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,4,8),
  18.                     8=>array(0,30,29,29,30,30,29,30,29,30,30,29,30,0,5,9),
  19.                     9=>array(2,29,30,29,29,30,29,30,29,30,30,30,29,30,6,10),
  20.                     10=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,7,11),
  21.                     11=>array(6,30,29,30,29,29,30,29,29,30,30,29,30,30,8,12),
  22.                     12=>array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,9,1),
  23.                     13=>array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,10,2),
  24.                     14=>array(5,30,30,29,30,29,30,29,30,29,30,29,29,30,1,3),
  25.                     15=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,2,4),
  26.                     16=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,3,5),
  27.                     17=>array(2,30,29,29,30,29,30,30,29,30,30,29,30,29,4,6),
  28.                     18=>array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,5,7),
  29.                     19=>array(7,29,30,29,29,30,29,29,30,30,29,30,30,30,6,8),
  30.                     20=>array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,7,9),
  31.                     21=>array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,8,10),
  32.                     22=>array(5,30,29,30,30,29,29,30,29,29,30,29,30,30,9,11),
  33.                     23=>array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,10,12),
  34.                     24=>array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,1,1),
  35.                     25=>array(4,30,29,30,29,30,30,29,30,30,29,30,29,30,2,2),
  36.                     26=>array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,3,3),
  37.                     27=>array(0,30,29,29,30,29,30,29,30,29,30,30,30,0,4,4),
  38.                     28=>array(2,29,30,29,29,30,29,29,30,29,30,30,30,30,5,5),
  39.                     29=>array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,6,6),
  40.                     30=>array(6,29,30,30,29,29,30,29,29,30,29,30,30,29,7,7),
  41.                     31=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,8,8),
  42.                     32=>array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,9,9),
  43.                     33=>array(5,29,30,30,29,30,30,29,30,29,30,29,29,30,10,10),
  44.                     34=>array(0,29,30,29,30,30,29,30,29,30,30,29,30,0,1,11),
  45.                     35=>array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,2,12),
  46.                     36=>array(3,30,29,29,30,29,29,30,30,29,30,30,30,29,3,1),
  47.                     37=>array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,4,2),
  48.                     38=>array(7,30,30,29,29,30,29,29,30,29,30,30,29,30,5,3),
  49.                     39=>array(0,30,30,29,29,30,29,29,30,29,30,29,30,0,6,4),
  50.                     40=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,7,5),
  51.                     41=>array(6,30,30,29,30,30,29,30,29,29,30,29,30,29,8,6),
  52.                     42=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,9,7),
  53.                     43=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,10,8),
  54.                     44=>array(4,30,29,30,29,30,29,30,29,30,30,29,30,30,1,9),
  55.                     45=>array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,2,10),
  56.                     46=>array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,3,11),
  57.                     47=>array(2,30,30,29,29,30,29,29,30,29,30,29,30,30,4,12),
  58.                     48=>array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,5,1),
  59.                     49=>array(7,30,29,30,30,29,30,29,29,30,29,30,29,30,6,2),
  60.                     50=>array(0,29,30,30,29,30,30,29,29,30,29,30,29,0,7,3),
  61.                     51=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,8,4),
  62.                     52=>array(5,29,30,29,30,29,30,29,30,30,29,30,29,30,9,5),
  63.                     53=>array(0,29,30,29,29,30,30,29,30,30,29,30,29,0,10,6),
  64.                     54=>array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,1,7),
  65.                     55=>array(3,29,30,29,30,29,29,30,29,30,29,30,30,30,2,8),
  66.                     56=>array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,3,9),
  67.                     57=>array(8,30,29,30,29,30,29,29,30,29,30,29,30,29,4,10),
  68.                     58=>array(0,30,30,30,29,30,29,29,30,29,30,29,30,0,5,11),
  69.                     59=>array(0,29,30,30,29,30,29,30,29,30,29,30,29,0,6,12),
  70.                     60=>array(6,30,29,30,29,30,30,29,30,29,30,29,30,29,7,1),
  71.                     61=>array(0,30,29,30,29,30,29,30,30,29,30,29,30,0,8,2),
  72.                     62=>array(0,29,30,29,29,30,29,30,30,29,30,30,29,0,9,3),
  73.                     63=>array(4,30,29,30,29,29,30,29,30,29,30,30,30,29,10,4),
  74.                     64=>array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,1,5),
  75.                     65=>array(0,29,30,29,30,29,29,30,29,29,30,30,29,0,2,6),
  76.                     66=>array(3,30,30,30,29,30,29,29,30,29,29,30,30,29,3,7),
  77.                     67=>array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,4,8),
  78.                     68=>array(7,29,30,29,30,30,29,30,29,30,29,30,29,30,5,9),
  79.                     69=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,6,10),
  80.                     70=>array(0,30,29,29,30,29,30,30,29,30,30,29,30,0,7,11),
  81.                     71=>array(5,29,30,29,29,30,29,30,29,30,30,30,29,30,8,12),
  82.                     72=>array(0,29,30,29,29,30,29,30,29,30,30,29,30,0,9,1),
  83.                     73=>array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,10,2),
  84.                     74=>array(4,30,30,29,30,29,29,30,29,29,30,30,29,30,1,3),
  85.                     75=>array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,2,4),
  86.                     76=>array(8,30,30,29,30,29,30,29,30,29,29,30,29,30,3,5),
  87.                     77=>array(0,30,29,30,30,29,30,29,30,29,30,29,29,0,4,6),
  88.                     78=>array(0,30,29,30,30,29,30,30,29,30,29,30,29,0,5,7),
  89.                     79=>array(6,30,29,29,30,29,30,30,29,30,30,29,30,29,6,8),
  90.                     80=>array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,7,9),
  91.                     81=>array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,8,10),
  92.                     82=>array(4,30,29,30,29,29,30,29,29,30,29,30,30,30,9,11),
  93.                     83=>array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,10,12),
  94.                     84=>array(10,30,29,30,30,29,29,30,29,29,30,29,30,30,1,1),
  95.                     85=>array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,2,2),
  96.                     86=>array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,3,3),
  97.                     87=>array(6,30,29,30,29,30,30,29,30,30,29,30,29,29,4,4),
  98.                     88=>array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,5,5),
  99.                     89=>array(0,30,29,29,30,29,29,30,30,29,30,30,30,0,6,6),
  100.                     90=>array(5,29,30,29,29,30,29,29,30,29,30,30,30,30,7,7),
  101.                     91=>array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,8,8),
  102.                     92=>array(0,29,30,30,29,29,30,29,29,30,29,30,30,0,9,9),
  103.                     93=>array(3,29,30,30,29,30,29,30,29,29,30,29,30,29,10,10),
  104.                     94=>array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,1,11),
  105.                     95=>array(8,29,30,30,29,30,29,30,30,29,29,30,29,30,2,12),
  106.                     96=>array(0,29,30,29,30,30,29,30,29,30,30,29,29,0,3,1),
  107.                     97=>array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,4,2),
  108.                     98=>array(5,30,29,29,30,29,29,30,30,29,30,30,29,30,5,3),
  109.                     99=>array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,6,4),
  110.                     100=>array(0,30,30,29,29,30,29,29,30,29,30,30,29,0,7,5),
  111.                     101=>array(4,30,30,29,30,29,30,29,29,30,29,30,29,30,8,6),
  112.                     102=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,9,7),
  113.                     103=>array(0,30,30,29,30,30,29,30,29,29,30,29,30,0,10,8),
  114.                     104=>array(2,29,30,29,30,30,29,30,29,30,29,30,29,30,1,9),
  115.                     105=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,2,10),
  116.                     106=>array(7,30,29,30,29,30,29,30,29,30,30,29,30,30,3,11),
  117.                     107=>array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,4,12),
  118.                     108=>array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,5,1),
  119.                     109=>array(5,30,30,29,29,30,29,29,30,29,30,29,30,30,6,2),
  120.                     110=>array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,7,3),
  121.                     111=>array(0,30,29,30,30,29,30,29,29,30,29,30,29,0,8,4),
  122.                     112=>array(4,30,29,30,30,29,30,29,30,29,30,29,30,29,9,5),
  123.                     113=>array(0,30,29,30,29,30,30,29,30,29,30,29,30,0,10,6),
  124.                     114=>array(9,29,30,29,30,29,30,29,30,30,29,30,29,30,1,7),
  125.                     115=>array(0,29,30,29,29,30,29,30,30,30,29,30,29,0,2,8),
  126.                     116=>array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,3,9),
  127.                     117=>array(6,29,30,29,30,29,29,30,29,30,29,30,30,30,4,10),
  128.                     118=>array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,5,11),
  129.                     119=>array(0,30,29,30,29,30,29,29,30,29,29,30,30,0,6,12),
  130.                     120=>array(4,29,30,30,30,29,30,29,29,30,29,30,29,30,7,1)
  131.                    );
  132. ##############################
  133.   #农历天干
  134.   $mten=array("null","甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
  135.   #农历地支
  136.   $mtwelve=array("null","子(鼠)","丑(牛)","寅(虎)","卯(兔)","辰(龙)",
  137.                  "巳(蛇)","午(马)","未(羊)","申(猴)","酉(鸡)","戌(狗)","亥(猪)");
  138.   #农历月份
  139.   $mmonth=array("闰","正","二","三","四","五","六",
  140.                 "七","八","九","十","十一","十二","月");
  141.   #农历日
  142.   $mday=array("null","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",
  143.               "十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",
  144.               "廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十");
  145. ##############################
  146.   #星期
  147.   $weekday = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
  148.   #阳历总天数 至1900年12月21日
  149.   $total=11;
  150.   #阴历总天数
  151.   $mtotal=0;
  152. ##############################
  153.   #获得当日日期
  154.   //$today=getdate();  //获取今天的日期
  155.   if($nian<1901 || $nian>2020) die("年份出错!");
  156.   //$cur_wday=$today["wday"]; //星期中第几天的数字表示
  157.   for($y=1901;$y<$nian;$y++) { //计算到所求日期阳历的总天数-自1900年12月21日始,先算年的和
  158.        $total+=365;
  159.        if ($y%4==0) $total++;
  160.   }
  161.   switch($yue) { //再加当年的几个月
  162.          case 12:
  163.               $total+=30;
  164.          case 11:
  165.               $total+=31;
  166.          case 10:
  167.               $total+=30;
  168.          case 9:
  169.               $total+=31;
  170.          case 8:
  171.               $total+=31;
  172.          case 7:
  173.               $total+=30;
  174.          case 6:
  175.               $total+=31;
  176.          case 5:
  177.               $total+=30;
  178.          case 4:
  179.               $total+=31;
  180.          case 3:
  181.               $total+=28;
  182.          case 2:
  183.               $total+=31;
  184.   }
  185.   if($nian%4 == 0 && $yue>2) $total++; //如果当年是闰年还要加一天
  186.   $total=$total+$ri-1; //加当月的天数
  187.   $flag1=0;  //判断跳出循环的条件
  188.   $j=0;
  189.   while ($j<=120){  //用农历的天数累加来判断是否超过阳历的天数
  190.       $i=1;
  191.       while ($i<=13){
  192.             $mtotal+=$everymonth[$j][$i];
  193.             if ($mtotal>=$total){
  194.                  $flag1=1;
  195.                  break;
  196.             }
  197.             $i++;
  198.       }
  199.       if ($flag1==1) break;
  200.       $j++;
  201.   }
  202.   if($everymonth[$j][0]<>0 and $everymonth[$j][0]<$i){ //原来错在这里,对闰月没有修补
  203.       $mm=$i-1;
  204.   }
  205.   else{
  206.       $mm=$i;
  207.   }
  208.   if($i==$everymonth[$j][0]+1 and $everymonth[$j][0]<>0) {
  209.       $nlmon=$mmonth[0].$mmonth[$mm];#闰月
  210.   }
  211.   else {
  212.       $nlmon=$mmonth[$mm].$mmonth[13];
  213.   }
  214.   #计算所求月份1号的农历日期
  215.   $md=$everymonth[$j][$i]-($mtotal-$total);
  216.   if($md > $everymonth[$j][$i])
  217.       $md-=$everymonth[$j][$i];
  218.   $nlday=$mday[$md];
  219.    
  220.   //$nowday=date("Y年n月j日 ")."w".$weekday[$cur_wday]." ".$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年".$nlmon.$nlday;
  221.   $nowday=$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年 ".$nlmon.$nlday;
  222.   return $nowday;
  223. }
  224. echo nongli('20160807'); //标准8位
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|IPiaoBo Inc. ( 渝ICP备17002826号 )

GMT+8, 2024-3-29 13:30 , Processed in 0.077410 second(s), 52 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表