*/
header(“Content-Type:text/html;charset=utf-8”);
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(
y
e
a
r
,
year,
year,month,$date)
{
//debugger;
$yearData =
t
h
i
s
−
>
l
u
n
a
r
I
n
f
o
[
this->lunarInfo[
this−>lunarInfo[year-
t
h
i
s
−
>
M
I
N
Y
E
A
R
]
;
i
f
(
this->MIN_YEAR]; if(
this−>MINYEAR];if(year==KaTeX parse error: Expected 'EOF', got '&' at position 15: this->MIN_YEAR&̲&month<=2&&$date<=9) return array(1891,‘正月’,‘初一’,‘辛卯’,1,1,‘兔’);
return
t
h
i
s
−
>
g
e
t
L
u
n
a
r
B
y
B
e
t
w
e
e
n
(
this->getLunarByBetween(
this−>getLunarByBetween(year,
t
h
i
s
−
>
g
e
t
D
a
y
s
B
e
t
w
e
e
n
S
o
l
a
r
(
this->getDaysBetweenSolar(
this−>getDaysBetweenSolar(year,
m
o
n
t
h
,
month,
month,date,
y
e
a
r
D
a
t
a
[
1
]
,
yearData[1],
yearData[1],yearData[2]));
}
function convertSolarMonthToLunar($year,$month)
{
$yearData =
t
h
i
s
−
>
l
u
n
a
r
I
n
f
o
[
this->lunarInfo[
this−>lunarInfo[year-
t
h
i
s
−
>
M
I
N
Y
E
A
R
]
;
i
f
(
this->MIN_YEAR]; if(
this−>MINYEAR];if(year==KaTeX parse error: Expected 'EOF', got '&' at position 15: this->MIN_YEAR&̲&month<=2&&$date<=9) return array(1891,‘正月’,‘初一’,‘辛卯’,1,1,‘兔’);
$month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$dd =
m
o
n
t
h
d
a
y
s
a
r
y
[
month_days_ary[
monthdaysary[month];
if(
t
h
i
s
−
>
i
s
L
e
a
p
Y
e
a
r
(
this->isLeapYear(
this−>isLeapYear(year) && $month == 2) $dd ;
l
u
n
a
r
a
r
y
=
a
r
r
a
y
(
)
;
f
o
r
(
lunar_ary = array(); for (
lunarary=array();for(i = 1; $i < $dd; $i )
{
$array =
t
h
i
s
−
>
g
e
t
L
u
n
a
r
B
y
B
e
t
w
e
e
n
(
this->getLunarByBetween(
this−>getLunarByBetween(year,
t
h
i
s
−
>
g
e
t
D
a
y
s
B
e
t
w
e
e
n
S
o
l
a
r
(
this->getDaysBetweenSolar(
this−>getDaysBetweenSolar(year, $month, $i, $yearData[1], $yearData[2]));
$array[] = $year . ‘-’ . $month . ‘-’ . $i;
l
u
n
a
r
a
r
y
[
lunar_ary[
lunarary[i] = $array;
}
return $lunar_ary;
}
/\*\*
* 将阴历转换为阳历
* @param year 阴历-年
* @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0
* @param date 阴历-日
*/
function convertLunarToSolar(
y
e
a
r
,
year,
year,month,$date)
{
$yearData =
t
h
i
s
−
>
l
u
n
a
r
I
n
f
o
[
this->lunarInfo[
this−>lunarInfo[year-$this->MIN_YEAR];
$between =
t
h
i
s
−
>
g
e
t
D
a
y
s
B
e
t
w
e
e
n
L
u
n
a
r
(
this->getDaysBetweenLunar(
this−>getDaysBetweenLunar(year,
m
o
n
t
h
,
month,
month,date);
r
e
s
=
m
k
t
i
m
e
(
0
,
0
,
0
,
res = mktime(0,0,0,
res=mktime(0,0,0,yearData[1],
y
e
a
r
D
a
t
a
[
2
]
,
yearData[2],
yearData[2],year);
$res = date(‘Y-m-d’, $res $between*24*60*60);
$day = explode(‘-’, $res);
$year = $day[0];
$month= $day[1];
$day =
d
a
y
[
2
]
;
r
e
t
u
r
n
a
r
r
a
y
(
day[2]; return array(
day[2];returnarray(year, $month, $day);
}
/\*\*
* 判断是否是闰年
* @param year
*/
function isLeapYear(KaTeX parse error: Expected '}', got 'EOF' at end of input: … return ((year%40 &&
y
e
a
r
0
!
=
0
)
∣
∣
(
year0 !=0) || (
year0!=0)∣∣(year@00));
}
/\*\*
* 获取干支纪年
* @param year
*/
function getLunarYearName($year)
{
$sky = array(‘庚’,‘辛’,‘壬’,‘癸’,‘甲’,‘乙’,‘丙’,‘丁’,‘戊’,‘己’);
$earth = array(‘申’,‘酉’,‘戌’,‘亥’,‘子’,‘丑’,‘寅’,‘卯’,‘辰’,‘巳’,‘午’,‘未’);
$year = $year.‘’;
return
s
k
y
[
sky[
sky[year{3}].
e
a
r
t
h
[
earth[
earth[year];
}
/\*\*
* 根据阴历年获取生肖
* @param year 阴历年
*/
function getYearZodiac($year)
{
$zodiac = array(‘猴’,‘鸡’,‘狗’,‘猪’,‘鼠’,‘牛’,‘虎’,‘兔’,‘龙’,‘蛇’,‘马’,‘羊’);
return
z
o
d
i
a
c
[
zodiac[
zodiac[year];
}
/\*\*
* 获取阳历月份的天数
* @param year 阳历-年
* @param month 阳历-月
*/
function getSolarMonthDays(
y
e
a
r
,
year,
year,month)
{
m
o
n
t
h
H
a
s
h
=
a
r
r
a
y
(
′
1
′
=
>
31
,
′
2
′
=
>
monthHash = array('1'=>31,'2'=>
monthHash=array(′1′=>31,′2′=>this->isLeapYear($year)?29:28,‘3’=>31,‘4’=>30,‘5’=>31,‘6’=>30,‘7’=>31,‘8’=>31,‘9’=>30,‘10’=>31,‘11’=>30,‘12’=>31);
return
m
o
n
t
h
H
a
s
h
[
"
monthHash["
monthHash["month"];
}
/\*\*
* 获取阴历月份的天数
* @param year 阴历-年
* @param month 阴历-月,从一月开始
*/
function getLunarMonthDays(
y
e
a
r
,
year,
year,month)
{
$monthData =
t
h
i
s
−
>
g
e
t
L
u
n
a
r
M
o
n
t
h
s
(
this->getLunarMonths(
this−>getLunarMonths(year);
return
m
o
n
t
h
D
a
t
a
[
monthData[
monthData[month-1];
}
/\*\*
* 获取阴历每月的天数的数组
* @param year
*/
function getLunarMonths($year)
{
$yearData =
t
h
i
s
−
>
l
u
n
a
r
I
n
f
o
[
this->lunarInfo[
this−>lunarInfo[year - $this->MIN_YEAR];
$leapMonth = $yearData[0];
b
i
t
=
d
e
c
b
i
n
(
bit = decbin(
bit=decbin(yearData[3]);
for ($i = 0;
i
<
s
t
r
l
e
n
(
i < strlen(
i<strlen(bit);$i )
b
i
t
A
r
r
a
y
[
bitArray[
bitArray[i] = substr($bit,
i
,
1
)
;
f
o
r
(
i, 1); for(
i,1);for(k=0,
k
l
e
n
=
16
−
c
o
u
n
t
(
klen=16-count(
klen=16−count(bitArray);
k
<
k<
k<klen;
k
)
a
r
r
a
y
_
u
n
s
h
i
f
t
(
k ) array\_unshift(
k)array_unshift(bitArray, ‘0’);
b
i
t
A
r
r
a
y
=
a
r
r
a
y
_
s
l
i
c
e
(
bitArray = array\_slice(
bitArray=array_slice(bitArray,0,(
l
e
a
p
M
o
n
t
h
=
=
0
?
12
:
13
)
)
;
f
o
r
(
leapMonth==0?12:13)); for(
leapMonth==0?12:13));for(i=0;
i
<
c
o
u
n
t
(
i<count(
i<count(bitArray); $i )
b
i
t
A
r
r
a
y
[
bitArray[
bitArray[i] =
b
i
t
A
r
r
a
y
[
bitArray[
bitArray[i] 29;
return $bitArray;
}
/\*\*
* 获取农历每年的天数
* @param year 农历年份
*/
function getLunarYearDays($year)
{
$yearData =
t
h
i
s
−
>
l
u
n
a
r
I
n
f
o
[
this->lunarInfo[
this−>lunarInfo[year-$this->MIN_YEAR];
$monthArray =
t
h
i
s
−
>
g
e
t
L
u
n
a
r
Y
e
a
r
M
o
n
t
h
s
(
this->getLunarYearMonths(
this−>getLunarYearMonths(year);
l
e
n
=
c
o
u
n
t
(
len = count(
len=count(monthArray);
return (
m
o
n
t
h
A
r
r
a
y
[
monthArray[
monthArray[len-1]==0?
m
o
n
t
h
A
r
r
a
y
[
monthArray[
monthArray[len-2]:
m
o
n
t
h
A
r
r
a
y
[
monthArray[
monthArray[len-1]);
}
function getLunarYearMonths($year)
{
//debugger;
$monthData =
t
h
i
s
−
>
g
e
t
L
u
n
a
r
M
o
n
t
h
s
(
this->getLunarMonths(
this−>getLunarMonths(year);
$res=array();
$temp=0;
$yearData =
t
h
i
s
−
>
l
u
n
a
r
I
n
f
o
[
this->lunarInfo[
this−>lunarInfo[year-$this->MIN_YEAR];
l
e
n
=
(
len = (
len=(yearData[0]==0?12:13);
for(
i
=
0
;
i=0;
i=0;i<
l
e
n
;
len;
len;i )
{
t
e
m
p
=
0
;
f
o
r
(
temp=0; for(
temp=0;for(j=0;
j
<
=
j<=
j<=i;$j )
t
e
m
p
=
temp =
temp=monthData[
j
]
;
a
r
r
a
y
_
p
u
s
h
(
j]; array\_push(
j];array_push(res, $temp);
}
return $res;
}
/\*\*
* 获取闰月
* @param year 阴历年份
*/
function getLeapMonth($year)
{
$yearData =
t
h
i
s
−
>
l
u
n
a
r
I
n
f
o
[
this->lunarInfo[
this−>lunarInfo[year-$this->MIN_YEAR];
return $yearData[0];
}
/\*\*
* 计算阴历日期与正月初一相隔的天数
* @param year
* @param month
* @param date
*/
function getDaysBetweenLunar(
y
e
a
r
,
year,
year,month,$date)
{
$yearMonth =
t
h
i
s
−
>
g
e
t
L
u
n
a
r
M
o
n
t
h
s
(
this->getLunarMonths(
this−>getLunarMonths(year);
r
e
s
=
0
;
f
o
r
(
res=0; for(
res=0;for(i=1;
i
<
i<
i<month;$i )
r
e
s
=
res =
res=yearMonth[$i-1];
r
e
s
=
res =
res=date-1;
return $res;
}
/\*\*
* 计算2个阳历日期之间的天数
* @param year 阳历年
* @param cmonth
* @param cdate
* @param dmonth 阴历正月对应的阳历月份
* @param ddate 阴历初一对应的阳历天数
*/
function getDaysBetweenSolar(
y
e
a
r
,
year,
year,cmonth,
c
d
a
t
e
,
cdate,
cdate,dmonth,$ddate)
{
a
=
m
k
t
i
m
e
(
0
,
0
,
0
,
a = mktime(0,0,0,
a=mktime(0,0,0,cmonth,
c
d
a
t
e
,
cdate,
cdate,year);
b
=
m
k
t
i
m
e
(
0
,
0
,
0
,
b = mktime(0,0,0,
b=mktime(0,0,0,dmonth,
d
d
a
t
e
,
ddate,
ddate,year);
return ceil((
a
−
a-
a−b)/24/3600);
}
/\*\*
* 根据距离正月初一的天数计算阴历日期
* @param year 阳历年
* @param between 天数
*/
function getLunarByBetween(
y
e
a
r
,
year,
year,between)
{
//debugger;
$lunarArray = array();
$yearMonth=array();
$t=0;
$e=0;
$leapMonth=0;
m
=
′
′
;
i
f
(
m=''; if(
m=′′;if(between==0)
{
array_push($lunarArray, $year,‘正月’,‘初一’);
$t = 1;
$e = 1;
}
else
{
$year = $between>0?
y
e
a
r
:
(
year : (
year:(year-1);
$yearMonth =
t
h
i
s
−
>
g
e
t
L
u
n
a
r
Y
e
a
r
M
o
n
t
h
s
(
this->getLunarYearMonths(
this−>getLunarYearMonths(year);
$leapMonth =
t
h
i
s
−
>
g
e
t
L
e
a
p
M
o
n
t
h
(
this->getLeapMonth(
this−>getLeapMonth(year);
$between =
b
e
t
w
e
e
n
>
0
?
between>0?
between>0?between : (
t
h
i
s
−
>
g
e
t
L
u
n
a
r
Y
e
a
r
D
a
y
s
(
this->getLunarYearDays(
this−>getLunarYearDays(year)
b
e
t
w
e
e
n
)
;
f
o
r
(
between); for(
between);for(i=0;
i
<
13
;
i<13;
i<13;i )
{
if(
b
e
t
w
e
e
n
=
=
between==
between==yearMonth[$i])
{
t
=
t=
t=i 2;
KaTeX parse error: Expected 'EOF', got '}' at position 57: … }̲else if(between<
y
e
a
r
M
o
n
t
h
[
yearMonth[
yearMonth[i])
{
t
=
t=
t=i 1;
e
=
e=
e=between-(empty(
y
e
a
r
M
o
n
t
h
[
yearMonth[
yearMonth[i-1])?0:
y
e
a
r
M
o
n
t
h
[
yearMonth[
yearMonth[i-1]) 1;
break;
}
}
m
=
(
m = (
m=(leapMonth!=0&&
t
=
=
t==
t==leapMonth 1)?(‘闰’.
t
h
i
s
−
>
g
e
t
C
a
p
i
t
a
l
N
u
m
(
this->getCapitalNum(
this−>getCapitalNum(t- 1,true)):
t
h
i
s
−
>
g
e
t
C
a
p
i
t
a
l
N
u
m
(
(
this->getCapitalNum((
this−>getCapitalNum((leapMonth!=0&&
l
e
a
p
M
o
n
t
h
1
<
leapMonth 1<
leapMonth1<t?(
t
−
1
)
:
t-1):
t−1):t),true);
array_push(
l
u
n
a
r
A
r
r
a
y
,
lunarArray,
lunarArray,year,
m
,
m,
m,this->getCapitalNum(KaTeX parse error: Expected 'EOF', got '}' at position 24: …); }̲ ar…lunarArray,
t
h
i
s
−
>
g
e
t
L
u
n
a
r
Y
e
a
r
N
a
m
e
(
this->getLunarYearName(
this−>getLunarYearName(year));// 天干地支
array_push(
l
u
n
a
r
A
r
r
a
y
,
lunarArray,
lunarArray,t,
e
)
;
a
r
r
a
y
_
p
u
s
h
(
e); array\_push(
e);array_push(lunarArray,
t
h
i
s
−
>
g
e
t
Y
e
a
r
Z
o
d
i
a
c
(
this->getYearZodiac(
this−>getYearZodiac(year));// 12生肖
array_push(
l
u
n
a
r
A
r
r
a
y
,
lunarArray,
lunarArray,leapMonth);// 闰几月
return $lunarArray;
}
/\*\*
* 获取数字的阴历叫法
* @param num 数字
* @param isMonth 是否是月份的数字
*/
function getCapitalNum(
n
u
m
,
num,
num,isMonth)
{
$isMonth = $isMonth || false;
$dateHash=array(‘0’=>‘’,‘1’=>‘一’,‘2’=>‘二’,‘3’=>‘三’,‘4’=>‘四’,‘5’=>‘五’,‘6’=>‘六’,‘7’=>‘七’,‘8’=>‘八’,‘9’=>‘九’,‘10’=>‘十 ‘);
$monthHash=array(‘0’=>’’,‘1’=>‘正月’,‘2’=>‘二月’,‘3’=>‘三月’,‘4’=>‘四月’,‘5’=>‘五月’,‘6’=>‘六月’,‘7’=>‘七月’,‘8’=>‘八月’,‘9’=>‘九月’,‘10’=>‘十月’,‘11’=>‘冬月’,‘12’=>‘腊月’);
r
e
s
=
′
′
;
i
f
(
res=''; if(
res=′′;if(isMonth) $res =
m
o
n
t
h
H
a
s
h
[
monthHash[
monthHash[num];
else
{
if($num<=10)
r
e
s
=
′
初
′
.
res = '初'.
res=′初′.dateHash[
n
u
m
]
;
e
l
s
e
i
f
(
num]; else if(
num];elseif(num>10&&$num<20)
r
e
s
=
′
十
′
.
res = '十'.
res=′十′.dateHash[
n
u
m
−
10
]
;
e
l
s
e
i
f
(
num-10]; else if(
num−10];elseif(num20)
r
e
s
=
"
二十
"
;
e
l
s
e
i
f
(
res = "二十"; else if(
res="二十";elseif(num>20&&$num<30)
r
e
s
=
"
廿
"
.
res = "廿".
res="廿".dateHash[
n
u
m
−
20
]
;
e
l
s
e
i
f
(
num-20]; else if(
num−20];elseif(num30) $res = “三十”;
}
return $res;
}
/\*
* 节气通用算法
*/
function getJieQi(
y
e
a
r
,
_year,
year,month,$day)
{
y
e
a
r
=
s
u
b
s
t
r
(
year = substr(
year=substr(_year,-2) 0;
$coefficient = array(
array(5.4055,2019,-1),//小寒
array(20.12,2082,1),//大寒
array(3.87),//立春
array(18.74,2026,-1),//雨水
array(5.63),//惊蛰
array(20.646,2084,1),//春分
array(4.81),//清明
array(20.1),//谷雨
array(5.52,1911,1),//立夏
array(21.04,2008,1),//小满
array(5.678,1902,1),//芒种
array(21.37,1928,1),//夏至