# 算法-如何用公历推算阴历

WP主题讨论 主题：1013 回复：2239

# 算法-如何用公历推算阴历

### 评论（3）

2017-10-13 3 楼

（4-2）÷2×10 + 3 + 4 = 17

（1+10－7）÷2×10 + 3 +（1+10）= 34

2005－3 = 2002 ，取个位数2作天干序数，即“乙”
（2005－3）÷ 12 = 166 余10，取余数10作地支序数，即“酉”

1983－3 = 1980 ，个位数是 0 ，看作10 ，10是天干“癸”的序数。
（1983－3）÷ 12 = 165 余数是 0 ,看作12 ,12是地支“亥”的序数。

2017-09-28 2 楼

/
@PHP阳历到农历转换的一个类
@ Cal函数 将阳历日期转换成阴历日期
@ returnInput 返回输入的日期
/
class Calendar
{

# 农历每月的天数

``````var \$everyCMonth=array(
0=&gt;array(8,0,0,0,0,0,0,0,0,0,0,0,29,30,7,1),
1=&gt;array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,8,2),
2=&gt;array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,9,3),
3=&gt;array(5,29,30,29,30,29,29,30,29,29,30,30,29,30,10,4),
4=&gt;array(0,30,30,29,30,29,29,30,29,29,30,30,29,0,1,5),
5=&gt;array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,2,6),
6=&gt;array(4,29,30,30,29,30,29,30,29,30,29,30,29,30,3,7),
7=&gt;array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,4,8),
8=&gt;array(0,30,29,29,30,30,29,30,29,30,30,29,30,0,5,9),
9=&gt;array(2,29,30,29,29,30,29,30,29,30,30,30,29,30,6,10),
10=&gt;array(0,29,30,29,29,30,29,30,29,30,30,30,29,0,7,11),
11=&gt;array(6,30,29,30,29,29,30,29,29,30,30,29,30,30,8,12),
12=&gt;array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,9,1),
13=&gt;array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,10,2),
14=&gt;array(5,30,30,29,30,29,30,29,30,29,30,29,29,30,1,3),
15=&gt;array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,2,4),
16=&gt;array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,3,5),
17=&gt;array(2,30,29,29,30,29,30,30,29,30,30,29,30,29,4,6),
18=&gt;array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,5,7),
19=&gt;array(7,29,30,29,29,30,29,29,30,30,29,30,30,30,6,8),
20=&gt;array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,7,9),
21=&gt;array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,8,10),
22=&gt;array(5,30,29,30,30,29,29,30,29,29,30,29,30,30,9,11),
23=&gt;array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,10,12),
24=&gt;array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,1,1),
25=&gt;array(4,30,29,30,29,30,30,29,30,30,29,30,29,30,2,2),
26=&gt;array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,3,3),
27=&gt;array(0,30,29,29,30,29,30,29,30,29,30,30,30,0,4,4),
28=&gt;array(2,29,30,29,29,30,29,29,30,29,30,30,30,30,5,5),
29=&gt;array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,6,6),
30=&gt;array(6,29,30,30,29,29,30,29,29,30,29,30,30,29,7,7),
31=&gt;array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,8,8),
32=&gt;array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,9,9),
33=&gt;array(5,29,30,30,29,30,30,29,30,29,30,29,29,30,10,10),
34=&gt;array(0,29,30,29,30,30,29,30,29,30,30,29,30,0,1,11),
35=&gt;array(0,29,29,30,29,30,29,30,30,29,30,30,29,0,2,12),
36=&gt;array(3,30,29,29,30,29,29,30,30,29,30,30,30,29,3,1),
37=&gt;array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,4,2),
38=&gt;array(7,30,30,29,29,30,29,29,30,29,30,30,29,30,5,3),
39=&gt;array(0,30,30,29,29,30,29,29,30,29,30,29,30,0,6,4),
40=&gt;array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,7,5),
41=&gt;array(6,30,30,29,30,30,29,30,29,29,30,29,30,29,8,6),
42=&gt;array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,9,7),
43=&gt;array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,10,8),
44=&gt;array(4,30,29,30,29,30,29,30,29,30,30,29,30,30,1,9),
45=&gt;array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,2,10),
46=&gt;array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,3,11),
47=&gt;array(2,30,30,29,29,30,29,29,30,29,30,29,30,30,4,12),
48=&gt;array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,5,1),
49=&gt;array(7,30,29,30,30,29,30,29,29,30,29,30,29,30,6,2),
50=&gt;array(0,29,30,30,29,30,30,29,29,30,29,30,29,0,7,3),
51=&gt;array(0,30,29,30,30,29,30,29,30,29,30,29,30,0,8,4),
52=&gt;array(5,29,30,29,30,29,30,29,30,30,29,30,29,30,9,5),
53=&gt;array(0,29,30,29,29,30,30,29,30,30,29,30,29,0,10,6),
54=&gt;array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,1,7),
55=&gt;array(3,29,30,29,30,29,29,30,29,30,29,30,30,30,2,8),
56=&gt;array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,3,9),
57=&gt;array(8,30,29,30,29,30,29,29,30,29,30,29,30,29,4,10),
58=&gt;array(0,30,30,30,29,30,29,29,30,29,30,29,30,0,5,11),
59=&gt;array(0,29,30,30,29,30,29,30,29,30,29,30,29,0,6,12),
60=&gt;array(6,30,29,30,29,30,30,29,30,29,30,29,30,29,7,1),
61=&gt;array(0,30,29,30,29,30,29,30,30,29,30,29,30,0,8,2),
62=&gt;array(0,29,30,29,29,30,29,30,30,29,30,30,29,0,9,3),
63=&gt;array(4,30,29,30,29,29,30,29,30,29,30,30,30,29,10,4),
64=&gt;array(0,30,29,30,29,29,30,29,30,29,30,30,30,0,1,5),
65=&gt;array(0,29,30,29,30,29,29,30,29,29,30,30,29,0,2,6),
66=&gt;array(3,30,30,30,29,30,29,29,30,29,29,30,30,29,3,7),
67=&gt;array(0,30,30,29,30,30,29,29,30,29,30,29,30,0,4,8),
68=&gt;array(7,29,30,29,30,30,29,30,29,30,29,30,29,30,5,9),
69=&gt;array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,6,10),
70=&gt;array(0,30,29,29,30,29,30,30,29,30,30,29,30,0,7,11),
71=&gt;array(5,29,30,29,29,30,29,30,29,30,30,30,29,30,8,12),
72=&gt;array(0,29,30,29,29,30,29,30,29,30,30,29,30,0,9,1),
73=&gt;array(0,30,29,30,29,29,30,29,29,30,30,29,30,0,10,2),
74=&gt;array(4,30,30,29,30,29,29,30,29,29,30,30,29,30,1,3),
75=&gt;array(0,30,30,29,30,29,29,30,29,29,30,29,30,0,2,4),
76=&gt;array(8,30,30,29,30,29,30,29,30,29,29,30,29,30,3,5),
77=&gt;array(0,30,29,30,30,29,30,29,30,29,30,29,29,0,4,6),
78=&gt;array(0,30,29,30,30,29,30,30,29,30,29,30,29,0,5,7),
79=&gt;array(6,30,29,29,30,29,30,30,29,30,30,29,30,29,6,8),
80=&gt;array(0,30,29,29,30,29,30,29,30,30,29,30,30,0,7,9),
81=&gt;array(0,29,30,29,29,30,29,29,30,30,29,30,30,0,8,10),
82=&gt;array(4,30,29,30,29,29,30,29,29,30,29,30,30,30,9,11),
83=&gt;array(0,30,29,30,29,29,30,29,29,30,29,30,30,0,10,12),
84=&gt;array(10,30,29,30,30,29,29,30,29,29,30,29,30,30,1,1),
85=&gt;array(0,29,30,30,29,30,29,30,29,29,30,29,30,0,2,2),
86=&gt;array(0,29,30,30,29,30,30,29,30,29,30,29,29,0,3,3),
87=&gt;array(6,30,29,30,29,30,30,29,30,30,29,30,29,29,4,4),
88=&gt;array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,5,5),
89=&gt;array(0,30,29,29,30,29,29,30,30,29,30,30,30,0,6,6),
90=&gt;array(5,29,30,29,29,30,29,29,30,29,30,30,30,30,7,7),
91=&gt;array(0,29,30,29,29,30,29,29,30,29,30,30,30,0,8,8),
92=&gt;array(0,29,30,30,29,29,30,29,29,30,29,30,30,0,9,9),
93=&gt;array(3,29,30,30,29,30,29,30,29,29,30,29,30,29,10,10),
94=&gt;array(0,30,30,30,29,30,29,30,29,29,30,29,30,0,1,11),
95=&gt;array(8,29,30,30,29,30,29,30,30,29,29,30,29,30,2,12),
96=&gt;array(0,29,30,29,30,30,29,30,29,30,30,29,29,0,3,1),
97=&gt;array(0,30,29,30,29,30,29,30,30,29,30,30,29,0,4,2),
98=&gt;array(5,30,29,29,30,29,29,30,30,29,30,30,29,30,5,3),
99=&gt;array(0,30,29,29,30,29,29,30,29,30,30,30,29,0,6,4),
100=&gt;array(0,30,30,29,29,30,29,29,30,29,30,30,29,0,7,5),
101=&gt;array(4,30,30,29,30,29,30,29,29,30,29,30,29,30,8,6),
102=&gt;array(0,30,30,29,30,29,30,29,29,30,29,30,29,0,9,7),
103=&gt;array(0,30,30,29,30,30,29,30,29,29,30,29,30,0,10,8),
104=&gt;array(2,29,30,29,30,30,29,30,29,30,29,30,29,30,1,9),
105=&gt;array(0,29,30,29,30,29,30,30,29,30,29,30,29,0,2,10),
106=&gt;array(7,30,29,30,29,30,29,30,29,30,30,29,30,30,3,11),
107=&gt;array(0,29,29,30,29,29,30,29,30,30,30,29,30,0,4,12),
108=&gt;array(0,30,29,29,30,29,29,30,29,30,30,29,30,0,5,1),
109=&gt;array(5,30,30,29,29,30,29,29,30,29,30,29,30,30,6,2),
110=&gt;array(0,30,29,30,29,30,29,29,30,29,30,29,30,0,7,3),
111=&gt;array(0,30,29,30,30,29,30,29,29,30,29,30,29,0,8,4),
112=&gt;array(4,30,29,30,30,29,30,29,30,29,30,29,30,29,9,5),
113=&gt;array(0,30,29,30,29,30,30,29,30,29,30,29,30,0,10,6),
114=&gt;array(9,29,30,29,30,29,30,29,30,30,29,30,29,30,1,7),
115=&gt;array(0,29,30,29,29,30,29,30,30,30,29,30,29,0,2,8),
116=&gt;array(0,30,29,30,29,29,30,29,30,30,29,30,30,0,3,9),
117=&gt;array(6,29,30,29,30,29,29,30,29,30,29,30,30,30,4,10),
118=&gt;array(0,29,30,29,30,29,29,30,29,30,29,30,30,0,5,11),
119=&gt;array(0,30,29,30,29,30,29,29,30,29,29,30,30,0,6,12),
120=&gt;array(4,29,30,30,30,29,30,29,29,30,29,30,29,30,7,1)
);``````

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

# 农历天干

``````var \$mten=array("null","甲","乙","丙","丁","戊","己","庚","辛","壬","癸");    #农历地支
var \$mtwelve=array("null","子(鼠)","丑(牛)","寅(虎)","卯(兔)","辰(龙)",
"巳(蛇)","午(马)","未(羊)","申(猴)","酉(鸡)","戌(狗)","亥(猪)");    #农历月份
var \$mmonth=array("闰","正","二","三","四","五","六",
"七","八","九","十","十一","十二","月");
var \$mday=array("null","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",
"十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",
"廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十");#农历日``````

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

# 天干地支

``````var \$ten=0;
var \$twelve=0;
var \$dateInput=null;
function MyPub(\$cYear,\$cMonth,\$cDay)
{
\$total=11;#阳历总天数 至1900年12月21日
\$mtotal=0;#阴历总天数
for (\$y=1901;\$y&lt;\$cYear;\$y++)
{
\$total+=365;
if (\$y%4==0) \$total ++;
}
#再加当年的几个月
switch (\$cMonth){
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 (\$cYear%4==0 and \$cMonth&gt;2)
{
\$total++;
}

\$total+=\$cDay-1;

##############################
#用农历的天数累加来判断是否超过阳历的天数
for(\$j=0;\$j&lt;=120;\$j++)
{
\$i=1;
\$flag=0;
for(\$i=1;\$i&lt;=13;\$i++)
{
\$mtotal+=\$this-&gt;everyCMonth[\$j][\$i];
if (\$mtotal&gt;=\$total)
{
\$flag=1;
break;
}
}
if (\$flag==1)break;
}
return array("m"=&gt;\$j,"d"=&gt;\$i,"t"=&gt;\$total,"n"=&gt;\$mtotal);
}
function Cal(\$Year,\$Month,\$Day)
{
\$Par=\$this-&gt;MyPub(\$Year,\$Month,\$Day);
\$this-&gt; dateInput=array( 'year'=&gt; \$Year,
'month'=&gt; \$Month,
'day'=&gt; \$Day
);
\$md=\$this-&gt;everyCMonth[\$Par["m"]][\$Par["d"]]-(\$Par["n"]-\$Par["t"]);
\$week=(\$Par["t"]+5)%7;
if (\$this-&gt;everyCMonth[\$Par["m"]][0]&lt;&gt;0 and \$this-&gt;everyCMonth[\$Par["m"]][0]&lt;\$Par["d"])
{
\$mm=\$Par["d"]-1;
}else{
\$mm=\$Par["d"];
}
if (\$Par["d"]==\$this-&gt;everyCMonth[\$Par["d"]][0]+1 and \$this-&gt;everyCMonth[\$Par["d"]][0]&lt;&gt;0)
{
\$cMonth=\$this-&gt;mmonth[0].\$this-&gt;mmonth[\$mm];#闰月
}else{
\$cMonth=\$this-&gt;mmonth[\$mm].\$this-&gt;mmonth[13];
}
\$resultArray=array("year"=&gt;\$this-&gt;mten[\$this-&gt;everyCMonth[\$Par["m"]][14]].\$this-&gt;mtwelve[\$this-&gt;everyCMonth[\$Par["m"]][15]],
"month"=&gt;\$cMonth,
"day"=&gt;\$this-&gt;mday[\$md],
"week"=&gt;\$week);
\$resultArray['week']=\$this-&gt; numberToString(\$resultArray['week']);
return \$resultArray;
}
//将数字转换成字符串``````

private function numberToString(\$number){
\$return=null;
switch(\$number){
case 1:
\$return = '一';
break;
case 2:
\$return= '二';
break;
case 3:
\$return='三';
break;
case 4:
\$return='四';
break;
case 5:
\$return='五';
break;
case 6:
\$return='六';
break;
case 7:
\$return='七';
break;
default:
\$return='未知';
}
return \$return;
}
//输出输入的数据
function returnInput(){
return \$this-> dateInput;
}
}
/////调用
\$test=new Calendar();
\$Year=\$test->Cal(2012,9,4);
\$dateInput=\$test-> returnInput();
echo implode('-',\$dateInput).'的阴历日期是'.\$Year["year"]."年".\$Year["month"].\$Year["day"];

2017-08-26 1 楼

<?php
class Lunar {
var \$MIN_YEAR = 1891;
var \$MAX_YEAR = 2100;
var \$lunarInfo = array(
array(0,2,9,21936),array(6,1,30,9656),array(0,2,17,9584),array(0,2,6,21168),array(5,1,26,43344),array(0,2,13,59728),
array(0,2,2,27296),array(3,1,22,44368),array(0,2,10,43856),array(8,1,30,19304),array(0,2,19,19168),array(0,2,8,42352),
array(5,1,29,21096),array(0,2,16,53856),array(0,2,4,55632),array(4,1,25,27304),array(0,2,13,22176),array(0,2,2,39632),
array(2,1,22,19176),array(0,2,10,19168),array(6,1,30,42200),array(0,2,18,42192),array(0,2,6,53840),array(5,1,26,54568),
array(0,2,14,46400),array(0,2,3,54944),array(2,1,23,38608),array(0,2,11,38320),array(7,2,1,18872),array(0,2,20,18800),
array(0,2,8,42160),array(5,1,28,45656),array(0,2,16,27216),array(0,2,5,27968),array(4,1,24,44456),array(0,2,13,11104),
array(0,2,2,38256),array(2,1,23,18808),array(0,2,10,18800),array(6,1,30,25776),array(0,2,17,54432),array(0,2,6,59984),
array(5,1,26,27976),array(0,2,14,23248),array(0,2,4,11104),array(3,1,24,37744),array(0,2,11,37600),array(7,1,31,51560),
array(0,2,19,51536),array(0,2,8,54432),array(6,1,27,55888),array(0,2,15,46416),array(0,2,5,22176),array(4,1,25,43736),
array(0,2,13,9680),array(0,2,2,37584),array(2,1,22,51544),array(0,2,10,43344),array(7,1,29,46248),array(0,2,17,27808),
array(0,2,6,46416),array(5,1,27,21928),array(0,2,14,19872),array(0,2,3,42416),array(3,1,24,21176),array(0,2,12,21168),
array(8,1,31,43344),array(0,2,18,59728),array(0,2,8,27296),array(6,1,28,44368),array(0,2,15,43856),array(0,2,5,19296),
array(4,1,25,42352),array(0,2,13,42352),array(0,2,2,21088),array(3,1,21,59696),array(0,2,9,55632),array(7,1,30,23208),
array(0,2,17,22176),array(0,2,6,38608),array(5,1,27,19176),array(0,2,15,19152),array(0,2,3,42192),array(4,1,23,53864),
array(0,2,11,53840),array(8,1,31,54568),array(0,2,18,46400),array(0,2,7,46752),array(6,1,28,38608),array(0,2,16,38320),
array(0,2,5,18864),array(4,1,25,42168),array(0,2,13,42160),array(10,2,2,45656),array(0,2,20,27216),array(0,2,9,27968),
array(6,1,29,44448),array(0,2,17,43872),array(0,2,6,38256),array(5,1,27,18808),array(0,2,15,18800),array(0,2,4,25776),
array(3,1,23,27216),array(0,2,10,59984),array(8,1,31,27432),array(0,2,19,23232),array(0,2,7,43872),array(5,1,28,37736),
array(0,2,16,37600),array(0,2,5,51552),array(4,1,24,54440),array(0,2,12,54432),array(0,2,1,55888),array(2,1,22,23208),
array(0,2,9,22176),array(7,1,29,43736),array(0,2,18,9680),array(0,2,7,37584),array(5,1,26,51544),array(0,2,14,43344),
array(0,2,3,46240),array(4,1,23,46416),array(0,2,10,44368),array(9,1,31,21928),array(0,2,19,19360),array(0,2,8,42416),
array(6,1,28,21176),array(0,2,16,21168),array(0,2,5,43312),array(4,1,25,29864),array(0,2,12,27296),array(0,2,1,44368),
array(2,1,22,19880),array(0,2,10,19296),array(6,1,29,42352),array(0,2,17,42208),array(0,2,6,53856),array(5,1,26,59696),
array(0,2,13,54576),array(0,2,3,23200),array(3,1,23,27472),array(0,2,11,38608),array(11,1,31,19176),array(0,2,19,19152),
array(0,2,8,42192),array(6,1,28,53848),array(0,2,15,53840),array(0,2,4,54560),array(5,1,24,55968),array(0,2,12,46496),
array(0,2,1,22224),array(2,1,22,19160),array(0,2,10,18864),array(7,1,30,42168),array(0,2,17,42160),array(0,2,6,43600),
array(5,1,26,46376),array(0,2,14,27936),array(0,2,2,44448),array(3,1,23,21936),array(0,2,11,37744),array(8,2,1,18808),
array(0,2,19,18800),array(0,2,8,25776),array(6,1,28,27216),array(0,2,15,59984),array(0,2,4,27424),array(4,1,24,43872),
array(0,2,12,43744),array(0,2,2,37600),array(3,1,21,51568),array(0,2,9,51552),array(7,1,29,54440),array(0,2,17,54432),
array(0,2,5,55888),array(5,1,26,23208),array(0,2,14,22176),array(0,2,3,42704),array(4,1,23,21224),array(0,2,11,21200),
array(8,1,31,43352),array(0,2,19,43344),array(0,2,7,46240),array(6,1,27,46416),array(0,2,15,44368),array(0,2,5,21920),
array(4,1,24,42448),array(0,2,12,42416),array(0,2,2,21168),array(3,1,22,43320),array(0,2,9,26928),array(7,1,29,29336),
array(0,2,17,27296),array(0,2,6,44368),array(5,1,26,19880),array(0,2,14,19296),array(0,2,3,42352),array(4,1,24,21104),
array(0,2,10,53856),array(8,1,30,59696),array(0,2,18,54560),array(0,2,7,55968),array(6,1,27,27472),array(0,2,15,22224),
array(0,2,5,19168),array(4,1,25,42216),array(0,2,12,42192),array(0,2,1,53584),array(2,1,21,55592),array(0,2,9,54560)
);
/**

• 将阳历转换为阴历
• @param year 公历-年
• @param month 公历-月
• @param date 公历-日
*/
function convertSolarToLunar(\$year,\$month,\$date){
//debugger;
\$yearData = \$this->lunarInfo[\$year-\$this->MIN_YEAR];
if(\$year==\$this->MIN_YEAR&&\$month<=2&&\$date<=9){
return array(1891,'正月','初一','辛卯',1,1,'兔');
}
return \$this->getLunarByBetween(\$year,\$this->getDaysBetweenSolar(\$year,\$month,\$date,\$yearData[1],\$yearData[2]));
}
``````function convertSolarMonthToLunar(\$year,\$month) {
\$yearData = \$this-&gt;lunarInfo[\$year-\$this-&gt;MIN_YEAR];
if(\$year==\$this-&gt;MIN_YEAR&amp;&amp;\$month&lt;=2&amp;&amp;\$date&lt;=9){
return array(1891,'正月','初一','辛卯',1,1,'兔');
}
\$month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
\$dd = \$month_days_ary[\$month];
if(\$this-&gt;isLeapYear(\$year) &amp;&amp; \$month == 2) \$dd++;
\$lunar_ary = array();
for (\$i = 1; \$i &lt; \$dd; \$i++) {
\$array = \$this-&gt;getLunarByBetween(\$year,\$this-&gt;getDaysBetweenSolar(\$year, \$month, \$i, \$yearData[1], \$yearData[2]));
\$array[] = \$year . '-' . \$month . '-' . \$i;
\$lunar_ary[\$i] = \$array;
}
return \$lunar_ary;
}
/**
* 将阴历转换为阳历
* @param year 阴历-年
* @param month 阴历-月，闰月处理：例如如果当年闰五月，那么第二个五月就传六月，相当于阴历有13个月，只是有的时候第13个月的天数为0
* @param date 阴历-日
*/
function convertLunarToSolar(\$year,\$month,\$date){
\$yearData = \$this-&gt;lunarInfo[\$year-\$this-&gt;MIN_YEAR];
\$between = \$this-&gt;getDaysBetweenLunar(\$year,\$month,\$date);
\$res = mktime(0,0,0,\$yearData[1],\$yearData[2],\$year);
\$res = date('Y-m-d', \$res+\$between*24*60*60);
\$day    = explode('-', \$res);
\$year    = \$day[0];
\$month= \$day[1];
\$day    = \$day[2];
return array(\$year, \$month, \$day);
}
/**
* 判断是否是闰年
* @param year
*/
function isLeapYear(\$year){
return ((\$year%4==0 &amp;&amp; \$year%100 !=0) || (\$year%400==0));
}
/**
* 获取干支纪年
* @param year
*/
function getLunarYearName(\$year){
\$sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');
\$earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');
\$year = \$year.'';
return \$sky[\$year{3}].\$earth[\$year%12];
}
/**
* 根据阴历年获取生肖
* @param year 阴历年
*/
function getYearZodiac(\$year){
\$zodiac = array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');
return \$zodiac[\$year%12];
}
/**
* 获取阳历月份的天数
* @param year 阳历-年
* @param month 阳历-月
*/
function getSolarMonthDays(\$year,\$month){
\$monthHash = array('1'=&gt;31,'2'=&gt;\$this-&gt;isLeapYear(\$year)?29:28,'3'=&gt;31,'4'=&gt;30,'5'=&gt;31,'6'=&gt;30,'7'=&gt;31,'8'=&gt;31,'9'=&gt;30,'10'=&gt;31,'11'=&gt;30,'12'=&gt;31);
return \$monthHash["\$month"];
}
/**
* 获取阴历月份的天数
* @param year 阴历-年
* @param month 阴历-月，从一月开始
*/
function getLunarMonthDays(\$year,\$month){
\$monthData = \$this-&gt;getLunarMonths(\$year);
return \$monthData[\$month-1];
}
/**
* 获取阴历每月的天数的数组
* @param year
*/
function getLunarMonths(\$year){
\$yearData = \$this-&gt;lunarInfo[\$year - \$this-&gt;MIN_YEAR];
\$leapMonth = \$yearData[0];
\$bit = decbin(\$yearData[3]);
for (\$i = 0; \$i &lt; strlen(\$bit);\$i ++) {
\$bitArray[\$i] = substr(\$bit, \$i, 1);
}
for(\$k=0,\$klen=16-count(\$bitArray);\$k&lt;\$klen;\$k++){
array_unshift(\$bitArray, '0');
}
\$bitArray = array_slice(\$bitArray,0,(\$leapMonth==0?12:13));
for(\$i=0; \$i&lt;count(\$bitArray); \$i++){
\$bitArray[\$i] = \$bitArray[\$i] + 29;
}
return \$bitArray;
}
/**
* 获取农历每年的天数
* @param year 农历年份
*/
function getLunarYearDays(\$year){
\$yearData = \$this-&gt;lunarInfo[\$year-\$this-&gt;MIN_YEAR];
\$monthArray = \$this-&gt;getLunarYearMonths(\$year);
\$len = count(\$monthArray);
return (\$monthArray[\$len-1]==0?\$monthArray[\$len-2]:\$monthArray[\$len-1]);
}
function getLunarYearMonths(\$year){
//debugger;
\$monthData = \$this-&gt;getLunarMonths(\$year);
\$res=array();
\$temp=0;
\$yearData = \$this-&gt;lunarInfo[\$year-\$this-&gt;MIN_YEAR];
\$len = (\$yearData[0]==0?12:13);
for(\$i=0;\$i&lt;\$len;\$i++){
\$temp=0;
for(\$j=0;\$j&lt;=\$i;\$j++){
\$temp+=\$monthData[\$j];
}
array_push(\$res, \$temp);
}
return \$res;
}
/**
* 获取闰月
* @param year 阴历年份
*/
function getLeapMonth(\$year){
\$yearData = \$this-&gt;lunarInfo[\$year-\$this-&gt;MIN_YEAR];
return \$yearData[0];
}
/**
* 计算阴历日期与正月初一相隔的天数
* @param year
* @param month
* @param date
*/
function getDaysBetweenLunar(\$year,\$month,\$date){
\$yearMonth = \$this-&gt;getLunarMonths(\$year);
\$res=0;
for(\$i=1;\$i&lt;\$month;\$i++){
\$res +=\$yearMonth[\$i-1];
}
\$res+=\$date-1;
return \$res;
}
/**
* 计算2个阳历日期之间的天数
* @param year 阳历年
* @param cmonth
* @param cdate
* @param dmonth 阴历正月对应的阳历月份
* @param ddate 阴历初一对应的阳历天数
*/
function getDaysBetweenSolar(\$year,\$cmonth,\$cdate,\$dmonth,\$ddate){
\$a = mktime(0,0,0,\$cmonth,\$cdate,\$year);
\$b = mktime(0,0,0,\$dmonth,\$ddate,\$year);
return ceil((\$a-\$b)/24/3600);
}
/**
* 根据距离正月初一的天数计算阴历日期
* @param year 阳历年
* @param between 天数
*/
function getLunarByBetween(\$year,\$between){
//debugger;
\$lunarArray = array();
\$yearMonth=array();
\$t=0;
\$e=0;
\$leapMonth=0;
\$m='';
if(\$between==0){
array_push(\$lunarArray, \$year,'正月','初一');
\$t = 1;
\$e = 1;
}else{
\$year = \$between&gt;0? \$year : (\$year-1);
\$yearMonth = \$this-&gt;getLunarYearMonths(\$year);
\$leapMonth = \$this-&gt;getLeapMonth(\$year);
\$between = \$between&gt;0?\$between : (\$this-&gt;getLunarYearDays(\$year)+\$between);
for(\$i=0;\$i&lt;13;\$i++){
if(\$between==\$yearMonth[\$i]){
\$t=\$i+2;
\$e=1;
break;
}else if(\$between&lt;\$yearMonth[\$i]){
\$t=\$i+1;
\$e=\$between-(empty(\$yearMonth[\$i-1])?0:\$yearMonth[\$i-1])+1;
break;
}
}
\$m = (\$leapMonth!=0&amp;&amp;\$t==\$leapMonth+1)?('闰'.\$this-&gt;getCapitalNum(\$t- 1,true)):\$this-&gt;getCapitalNum((\$leapMonth!=0&amp;&amp;\$leapMonth+1&lt;\$t?(\$t-1):\$t),true);
array_push(\$lunarArray,\$year,\$m,\$this-&gt;getCapitalNum(\$e,false));
}
array_push(\$lunarArray,\$this-&gt;getLunarYearName(\$year));// 天干地支
array_push(\$lunarArray,\$t,\$e);
array_push(\$lunarArray,\$this-&gt;getYearZodiac(\$year));// 12生肖
array_push(\$lunarArray,\$leapMonth);// 闰几月
return \$lunarArray;
}
/**
* 获取数字的阴历叫法
* @param num 数字
* @param isMonth 是否是月份的数字
*/
function getCapitalNum(\$num,\$isMonth){
\$isMonth = \$isMonth || false;
\$dateHash=array('0'=&gt;'','1'=&gt;'一','2'=&gt;'二','3'=&gt;'三','4'=&gt;'四','5'=&gt;'五','6'=&gt;'六','7'=&gt;'七','8'=&gt;'八','9'=&gt;'九','10'=&gt;'十 ');
\$monthHash=array('0'=&gt;'','1'=&gt;'正月','2'=&gt;'二月','3'=&gt;'三月','4'=&gt;'四月','5'=&gt;'五月','6'=&gt;'六月','7'=&gt;'七月','8'=&gt;'八月','9'=&gt;'九月','10'=&gt;'十月','11'=&gt;'冬月','12'=&gt;'腊月');
\$res='';
if(\$isMonth){
\$res = \$monthHash[\$num];
}else{
if(\$num&lt;=10){
\$res = '初'.\$dateHash[\$num];
}else if(\$num&gt;10&amp;&amp;\$num&lt;20){
\$res = '十'.\$dateHash[\$num-10];
}else if(\$num==20){
\$res = "二十";
}else if(\$num&gt;20&amp;&amp;\$num&lt;30){
\$res = "廿".\$dateHash[\$num-20];
}else if(\$num==30){
\$res = "三十";
}
}
return \$res;
}``````

}
\$lunar = new Lunar();
\$month = \$lunar->convertLunarToSolar(2012, 1,1);
print_r(\$month);
exit;

1186 主题
2566 回复
12996 人气