php下实现农历日历的代码

复制代码 代码如下:

  php农历日历

  <?

  ###########################################

  #作者: 沈潋(S&S Lab)                      #

  #E-mail:[email protected]              #

  #web: http://www.focus-2000.com           #

  #                                         #

  #版权声明:                                #

  #作者开放版权                             #

  #允许无条件地使用本文件的全部或部分       #

  #可作任何修改或增补                       #

  #如果您使用了本文件,请给作者写一封E-mail #

  #如有问题欢迎同作者联系                   #

  #谢谢您的关注!                            #

  ###########################################

  /*

  *修改:小许

  *mail: [email protected]

  *web : http://www.xfocus.org

  *

  *说实在的,我对古历可以说一窍不通,下面这个数组还是不理解 可是作者的信箱好像不通

  *基本上是依样画葫芦,所以出现错误,见笑见笑,呵呵

  */

  #农历每月的天数

  $everymonth=array(

  0=>array(8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1),

  1=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,8,2),

  2=>array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,9,3),

  3=>array(5,29,30,29,30,29,29,30,29,29,30,30,29,30,10,4),

  4=>array(0,30,30,29,30,29,29,30,29,29,30,30,29,0,1,5),

  5=>array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,2,6),

  6=>array(4,29,30,30,29,30,29,30,29,30,29,30,29,30,3,7),

  7=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,4,8),

  8=>array(0,30,29,29,30,30,29,30,29,30,30,29,30,0,5,9),

  9=>array(2,29,30,29,29,30,29,30,29,30,30,30,29,30,6,10),

  10=>array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,7,11),

  11=>array(6,30,29,30,29,29,30,29,29,30,30,29,30,30,8,12),

  12=>array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,9,1),

  13=>array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,10,2),

  14=>array(5,30,30,29,30,29,30,29,30,29,30,29,29,30,1,3),

  15=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,2,4),

  16=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,3,5),

  17=>array(2,30,29,29,30,29,30,30,29,30,30,29,30,29,4,6),

  18=>array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,5,7),

  19=>array(7,29,30,29,29,30,29,29,30,30,29,30,30,30,6,8),

  20=>array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,7,9),

  21=>array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,8,10),

  22=>array(5,30,29,30,30,29,29,30,29,29,30,29,30,30,9,11),

  23=>array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,10,12),

  24=>array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,1,1),

  25=>array(4,30,29,30,29,30,30,29,30,30,29,30,29,30,2,2),

  26=>array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,3,3),

  27=>array(0,30,29,29,30,29,30,29,30,29,30,30,30,0,4,4),

  28=>array(2,29,30,29,29,30,29,29,30,29,30,30,30,30,5,5),

  29=>array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,6,6),

  30=>array(6,29,30,30,29,29,30,29,29,30,29,30,30,29,7,7),

  31=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,8,8),

  32=>array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,9,9),

  33=>array(5,29,30,30,29,30,30,29,30,29,30,29,29,30,10,10),

  34=>array(0,29,30,29,30,30,29,30,29,30,30,29,30,0,1,11),

  35=>array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,2,12),

  36=>array(3,30,29,29,30,29,29,30,30,29,30,30,30,29,3,1),

  37=>array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,4,2),

  38=>array(7,30,30,29,29,30,29,29,30,29,30,30,29,30,5,3),

  39=>array(0,30,30,29,29,30,29,29,30,29,30,29,30,0,6,4),

  40=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,7,5),

  41=>array(6,30,30,29,30,30,29,30,29,29,30,29,30,29,8,6),

  42=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,9,7),

  43=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,10,8),

  44=>array(4,30,29,30,29,30,29,30,29,30,30,29,30,30,1,9),

  45=>array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,2,10),

  46=>array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,3,11),

  47=>array(2,30,30,29,29,30,29,29,30,29,30,29,30,30,4,12),

  48=>array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,5,1),

  49=>array(7,30,29,30,30,29,30,29,29,30,29,30,29,30,6,2),

  50=>array(0,29,30,30,29,30,30,29,29,30,29,30,29,0,7,3),

  51=>array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,8,4),

  52=>array(5,29,30,29,30,29,30,29,30,30,29,30,29,30,9,5),

  53=>array(0,29,30,29,29,30,30,29,30,30,29,30,29,0,10,6),

  54=>array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,1,7),

  55=>array(3,29,30,29,30,29,29,30,29,30,29,30,30,30,2,8),

  56=>array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,3,9),

  57=>array(8,30,29,30,29,30,29,29,30,29,30,29,30,29,4,10),

  58=>array(0,30,30,30,29,30,29,29,30,29,30,29,30,0,5,11),

  59=>array(0,29,30,30,29,30,29,30,29,30,29,30,29,0,6,12),

  60=>array(6,30,29,30,29,30,30,29,30,29,30,29,30,29,7,1),

  61=>array(0,30,29,30,29,30,29,30,30,29,30,29,30,0,8,2),

  62=>array(0,29,30,29,29,30,29,30,30,29,30,30,29,0,9,3),

  63=>array(4,30,29,30,29,29,30,29,30,29,30,30,30,29,10,4),

  64=>array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,1,5),

  65=>array(0,29,30,29,30,29,29,30,29,29,30,30,29,0,2,6),

  66=>array(3,30,30,30,29,30,29,29,30,29,29,30,30,29,3,7),

  67=>array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,4,8),

  68=>array(7,29,30,29,30,30,29,30,29,30,29,30,29,30,5,9),

  69=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,6,10),

  70=>array(0,30,29,29,30,29,30,30,29,30,30,29,30,0,7,11),

  71=>array(5,29,30,29,29,30,29,30,29,30,30,30,29,30,8,12),

  72=>array(0,29,30,29,29,30,29,30,29,30,30,29,30,0,9,1),

  73=>array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,10,2),

  74=>array(4,30,30,29,30,29,29,30,29,29,30,30,29,30,1,3),

  75=>array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,2,4),

  76=>array(8,30,30,29,30,29,30,29,30,29,29,30,29,30,3,5),

  77=>array(0,30,29,30,30,29,30,29,30,29,30,29,29,0,4,6),

  78=>array(0,30,29,30,30,29,30,30,29,30,29,30,29,0,5,7),

  79=>array(6,30,29,29,30,29,30,30,29,30,30,29,30,29,6,8),

  80=>array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,7,9),

  81=>array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,8,10),

  82=>array(4,30,29,30,29,29,30,29,29,30,29,30,30,30,9,11),

  83=>array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,10,12),

  84=>array(10,30,29,30,30,29,29,30,29,29,30,29,30,30,1,1),

  85=>array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,2,2),

  86=>array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,3,3),

  87=>array(6,30,29,30,29,30,30,29,30,30,29,30,29,29,4,4),

  88=>array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,5,5),

  89=>array(0,30,29,29,30,29,29,30,30,29,30,30,30,0,6,6),

  90=>array(5,29,30,29,29,30,29,29,30,29,30,30,30,30,7,7),

  91=>array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,8,8),

  92=>array(0,29,30,30,29,29,30,29,29,30,29,30,30,0,9,9),

  93=>array(3,29,30,30,29,30,29,30,29,29,30,29,30,29,10,10),

  94=>array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,1,11),

  95=>array(8,29,30,30,29,30,29,30,30,29,29,30,29,30,2,12),

  96=>array(0,29,30,29,30,30,29,30,29,30,30,29,29,0,3,1),

  97=>array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,4,2),

  98=>array(5,30,29,29,30,29,29,30,30,29,30,30,29,30,5,3),

  99=>array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,6,4),

  100=>array(0,30,30,29,29,30,29,29,30,29,30,30,29,0,7,5),

  101=>array(4,30,30,29,30,29,30,29,29,30,29,30,29,30,8,6),

  102=>array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,9,7),

  103=>array(0,30,30,29,30,30,29,30,29,29,30,29,30,0,10,8),

  104=>array(2,29,30,29,30,30,29,30,29,30,29,30,29,30,1,9),

  105=>array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,2,10),

  106=>array(7,30,29,30,29,30,29,30,29,30,30,29,30,30,3,11),

  107=>array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,4,12),

  108=>array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,5,1),

  109=>array(5,30,30,29,29,30,29,29,30,29,30,29,30,30,6,2),

  110=>array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,7,3),

  111=>array(0,30,29,30,30,29,30,29,29,30,29,30,29,0,8,4),

  112=>array(4,30,29,30,30,29,30,29,30,29,30,29,30,29,9,5),

  113=>array(0,30,29,30,29,30,30,29,30,29,30,29,30,0,10,6),

  114=>array(9,29,30,29,30,29,30,29,30,30,29,30,29,30,1,7),

  115=>array(0,29,30,29,29,30,29,30,30,30,29,30,29,0,2,8),

  116=>array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,3,9),

  117=>array(6,29,30,29,30,29,29,30,29,30,29,30,30,30,4,10),

  118=>array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,5,11),

  119=>array(0,30,29,30,29,30,29,29,30,29,29,30,30,0,6,12),

  120=>array(4,29,30,30,30,29,30,29,29,30,29,30,29,30,7,1)

  );

  ##############################

  #农历天干

  $mten=array("null","甲","乙","丙","丁","戊","己","庚","辛","壬","癸");

  #农历地支

  $mtwelve=array("null","子(鼠)","丑(牛)","寅(虎)","卯(兔)","辰(龙)",

  "巳(蛇)","午(马)","未(羊)","申(猴)","酉(鸡)","戌(狗)","亥(猪)");

  #农历月份

  $mmonth=array("闰","正","二","三","四","五","六",

  "七","八","九","十","十一","十二","月");

  #农历日

  $mday=array("null","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",

  "十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",

  "廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十");

  ##############################

  #星期

  $weekday = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");

  #阳历总天数 至1900年12月21日

  $total=11;

  #阴历总天数

  $mtotal=0;

  ##############################

  #获得当日日期

  $today=getdate();

  if($today["year"]<1901 || $today["year"]>2020) die("年份出错!");

  $cur_wday=$today["wday"];

  for($y=1901;$y<$today["year"];$y++) { //计算到所求日期阳历的总天数-自1900年12月21日始,先算年的和

  $total+=365;

  if ($y%4==0) $total++;

  }

  switch($today["mon"]) { //再加当年的几个月

  case 12:

  $total+=30;

  case 11:

  $total+=31;

  case 10:

  $total+=30;

  case 9:

  $total+=31;

  case 8:

  $total+=31;

  case 7:

  $total+=30;

  case 6:

  $total+=31;

  case 5:

  $total+=30;

  case 4:

  $total+=31;

  case 3:

  $total+=28;

  case 2:

  $total+=31;

  }

  if($today["year"]%4 == 0 && $today["mon"]>2) $total++; //如果当年是闰年还要加一天

  $total=$total+$today["mday"]-1; //加当月的天数

  $flag1=0;  //判断跳出循环的条件

  $j=0;

  while ($j<=120){  //用农历的天数累加来判断是否超过阳历的天数

  $i=1;

  while ($i<=13){

  $mtotal+=$everymonth[$j][$i];

  if ($mtotal>=$total){

  $flag1=1;

  break;

  }

  $i++;

  }

  if ($flag1==1) break;

  $j++;

  }

  if($everymonth[$j][0]<>0 and $everymonth[$j][0]<$i){ //原来错在这里,对闰月没有修补

  $mm=$i-1;

  }

  else{

  $mm=$i;

  }

  if($i==$everymonth[$j][0]+1 and $everymonth[$j][0]<>0) {

  $nlmon=$mmonth[0].$mmonth[$mm];#闰月

  }

  else {

  $nlmon=$mmonth[$mm].$mmonth[13];

  }

  #计算所求月份1号的农历日期

  $md=$everymonth[$j][$i]-($mtotal-$total);

  if($md > $everymonth[$j][$i])

  $md-=$everymonth[$j][$i];

  $nlday=$mday[$md];

  $nowday=date("Y年n月j日 ").$weekday[$cur_wday]."<br>".$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年".$nlmon.$nlday;

  echo "<font color=#3333ff>$nowday</font>";

  ?>