php阳历转农历优化版

时间:2022-10-20 09:41:02

本文实例为大家分享了php阳历农历代码,供大家参考,具体内容如下

?
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
<?php
 
function nongli($riqi)
{
//优化修改 20160807 FXL
$nian=date('Y',strtotime($riqi));
$yue=date('m',strtotime($riqi));
$ri=date('d',strtotime($riqi));
 
 #源码部分原作者:沈潋(S&S Lab)
 #农历每月的天数
 $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($nian<1901 || $nian>2020) die("年份出错!");
 //$cur_wday=$today["wday"]; //星期中第几天的数字表示
 for($y=1901;$y<$nian;$y++) { //计算到所求日期阳历的总天数-自1900年12月21日始,先算年的和
    $total+=365;
    if ($y%4==0) $total++;
 }
 switch($yue) { //再加当年的几个月
     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($nian%4 == 0 && $yue>2) $total++; //如果当年是闰年还要加一天
 $total=$total+$ri-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日 ")."w".$weekday[$cur_wday]." ".$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年".$nlmon.$nlday;
 $nowday=$mten[$everymonth[$j][14]].$mtwelve[$everymonth[$j][15]]."年 ".$nlmon.$nlday;
 return $nowday;
}
echo nongli('20160807'); //标准8位

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。