发信人: siroh(方林) 
整理人: dalasthunder(2003-03-13 16:02:50), 站内信件
 | 
 
 
<?php
 #
 # 公历农历转换,转换范围 1921-02-08 至 2021-02-11
 # Email:[email protected]
 #
 # 算法来自C++ Builder园地 万年历组件,
 # http://go6.163.com/~cbuilder/works/index.html,不过已经不能访问了! :(
 #
 # array ChineseCalender([ int year, int month, int day]);
 #
 
 function ChineseCalender($curYear = "", $curMonth = "", $curDay = ""){
     #星期名
     $WeekName = array("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
 
     #天干名称
     $TianGan = array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
 
     #地支名称
     $DiZhi = array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
 
     #属相名称
     $ShuXiang = array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
 
     #农历日期名
     $DayName = array("*","初一","初二","初三","初四","初五","初六","初七","初八","初九","初十",
                          "十一","十二","十三","十四","十五","十六","十七","十八","十九","二十",
                          "廿一","廿二","廿三","廿四","廿五","廿六","廿七","廿八","廿九","三十");
 
     #农历月份名
     $MonName = array("*","正","二","三","四","五","六","七","八","九","十","十一","腊");
 
     #公历每月前面的天数
     $MonthAdd = array(0,31,59,90,120,151,181,212,243,273,304,334);
 
     #农历数据
     $NongliData =array( 2635,333387,1701,1748,267701,694,2391,133423,1175,396438,
                         3402,3749,331177,1453,694,201326,2350,465197,3221,3402,
                         400202,2901,1386,267611,605,2349,137515,2709,464533,1738,
                         2901,330421,1242,2651,199255,1323,529706,3733,1706,398762,
                         2741,1206,267438,2647,1318,204070,3477,461653,1386,2413,
                         330077,1197,2637,268877,3365,531109,2900,2922,398042,2395,
                         1179,267415,2635,661067,1701,1748,398772,2742,2391,330031,
                         1175,1611,200010,3749,527717,1452,2742,332397,2350,3222,
                         268949,3402,3493,133973,1386,464219,605,2349,334123,2709,
                         2890,267946,2773,592565,1210,2651,395863,1323,2707,265877);
     
     $curDate=sprintf("%04d-%02d-%02d", $curYear, $curMonth, $curDay);
     if($curDate < "1921-02-08" or $curDate > "2021-02-11"){
         $curDate=date("Y-m-d",time());
         list($curYear, $curMonth, $curDay) = split("-", $curDate);
     }
      
     #计算到初始时间1921年2月8日的天数:1921-02-08(正月初一)
     $TheDate = ($curYear-1921) * 365 + intval(($curYear - 1921) / 4) + $curDay + $MonthAdd[$curMonth - 1] - 38 + ((($curYear % 4) == 0 && $curMonth > 2) ? 1 : 0);
 
     #计算星期
     $curWeekday = $TheDate % 7 + 1;    
 
     #计算农历天干、地支、月、日
     $isEnd = 0;
     for($m = 0; $m < 100; $m ++){
         if($NongliData[$m] < 4095) $k = 11;
         else $k = 12;
         for($n = $k; $n >= 0; $n --){
             $bit = ($NongliData[$m] >> $n) & 1;
             if($TheDate <= 29 + $bit){
                 $isEnd = 1;
                 break;
             }
             $TheDate = $TheDate - 29 - $bit;
         }
     if($isEnd == 1) break;
     }
 
     $curYear = 1921 + $m;
     $curMonth = $k - $n + 1;
     $curDay = $TheDate;
 
     if($k == 12){
         if($curMonth == (intval($NongliData[$m] / 65536) + 1)) $curMonth = 1 - $curMonth;
         elseif($curMonth > (intval($NongliData[$m] / 65536) + 1)) $curMonth = $curMonth - 1;
     }
     
     #公历日期 
     $ChineseDate["Date"]     = $curDate;
     #星期
     $ChineseDate["Weekday"]  = $WeekName[$curWeekday];
     #生肖
     $ChineseDate["ShuXiang"] = $ShuXiang[(($curYear - 4) % 60) % 12];
     #农历天干
     $ChineseDate["TianGan"]  = $TianGan[(($curYear - 4) % 60) % 10];
     #农历地支
     $ChineseDate["Dizhi"]    = $DiZhi[(($curYear-4) % 60) % 12];
     #农历甲子
     $ChineseDate["JiaZi"]    = $ChineseDate["TianGan"] . $ChineseDate["Dizhi"];
     #农历年
     $ChineseDate["Year"]     = $ChineseDate["JiaZi"] . "年";
     #农历月
     $ChineseDate["Month"]    = (($curMonth < 1) ? "闰" . $MonName[-1 * $curMonth] : $MonName[$curMonth])."月";
     #农历日
     $ChineseDate["Day"]      = $DayName[$curDay];
     
     return $ChineseDate;
 }
 
 ?>
 
  ----
     | 
 
 
 |