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

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

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

夜无邪 发布于 2017-08-15 字数 45 浏览 1228 回复 3

诸位也别说没有公式,也不要说查万年历。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

虐人心 2017-10-13 3 楼

先认识一下“天干序数”和“地支序数”:

天 干: 甲 乙 丙 丁 戊 己 庚 辛 壬 癸
天干序数: 1 2 3 4 5 6 7 8 9 10

地 支: 子 丑 寅 卯 辰 巳 午 未 申 酉 戌 亥
地支序数: 1 2 3 4 5 6 7 8 9 10 11 12

一、由甲子年推算公历年

公式:(天干序数 - 地支序数)÷2×10 + 3 + 天干序数
上述得数再加任意一个60的倍数即可

例1:求丁丑年为公历何年。
解:天干“丁”的序数是4,地支“丑”的序数是2,代入上述公式:
(4-2)÷2×10 + 3 + 4 = 17
答:公元后第一个丁丑年为公元17年,17加60的倍数的年份均为丁丑年(……公元77年、 137年、……1817年、1877年、1937年、1997年、2057年……)。

注:如果天干序数比地支序数小,则公式中的两个天干序数要先加10。

例2:求甲午年的公历年份。
解:天干“甲”序数为1,地支“午”序数为7。天干“甲”的序数小于地支“午”的序 数,故天干序数1要先加10:
(1+10-7)÷2×10 + 3 +(1+10)= 34
答:公元后第一个甲午年为公元34年,34加60的倍数的年份均为甲午年(……公元94年、 154年、……1834年、1894年、1954年、2014年、2074年)。

二、由公历年推算干支年

公式:
取(公历年数-3)的个位数作天干的序数(个位数是0时看作10)
取(公历年数-3)÷12 的余数作地支的序数(余数是0时看作12)
用两个序数所对应的天干和地支相配

例1:求2005年的甲子
2005-3 = 2002 ,取个位数2作天干序数,即“乙”
(2005-3)÷ 12 = 166 余10,取余数10作地支序数,即“酉”
天干与地支配合为“乙酉”
答:2005年是乙酉年。

例2:求1983年的甲子
1983-3 = 1980 ,个位数是 0 ,看作10 ,10是天干“癸”的序数。
(1983-3)÷ 12 = 165 余数是 0 ,看作12 ,12是地支“亥”的序数。
天干与地支配合为“癸亥”
答:1983年为癸亥年。

这样推出年份

至于月份 就要根据每年相差的天数推了 你可以自己查查

偏爱自由 2017-09-28 2 楼

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

农历每月的天数

var $everyCMonth=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)
);

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

农历天干

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<$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>2)
        {
            $total++;
        }

        $total+=$cDay-1;

        ##############################
        #用农历的天数累加来判断是否超过阳历的天数
        for($j=0;$j<=120;$j++)
        {
            $i=1;
            $flag=0;
            for($i=1;$i<=13;$i++)
            {
                $mtotal+=$this->everyCMonth[$j][$i];
                if ($mtotal>=$total)
                {
                    $flag=1;
                    break;
                }
            }
            if ($flag==1)break;
        }
                return array("m"=>$j,"d"=>$i,"t"=>$total,"n"=>$mtotal);
}
function Cal($Year,$Month,$Day)
{
    $Par=$this->MyPub($Year,$Month,$Day);
    $this-> dateInput=array( 'year'=> $Year,
                                            'month'=> $Month,
                                            'day'=> $Day
                                        );
    $md=$this->everyCMonth[$Par["m"]][$Par["d"]]-($Par["n"]-$Par["t"]);
    $week=($Par["t"]+5)%7;
    if ($this->everyCMonth[$Par["m"]][0]<>0 and $this->everyCMonth[$Par["m"]][0]<$Par["d"])
    {
            $mm=$Par["d"]-1;
    }else{
            $mm=$Par["d"];
    }
    if ($Par["d"]==$this->everyCMonth[$Par["d"]][0]+1 and $this->everyCMonth[$Par["d"]][0]<>0)
    {
        $cMonth=$this->mmonth[0].$this->mmonth[$mm];#闰月
    }else{
        $cMonth=$this->mmonth[$mm].$this->mmonth[13];
    }
    $resultArray=array("year"=>$this->mten[$this->everyCMonth[$Par["m"]][14]].$this->mtwelve[$this->everyCMonth[$Par["m"]][15]],
                "month"=>$cMonth,
                "day"=>$this->mday[$md],
                "week"=>$week);
     $resultArray['week']=$this-> 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版本的)

<?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;