湘里妹子学术网

 找回密码
 注册
查看: 4639|回复: 0

農曆函數原始碼(calendar.phps)

[复制链接]
发表于 2004-7-11 21:55:30 | 显示全部楼层 |阅读模式
這是一位在歐洲留學的大陸留學生的作品
http://seba.studentenweb.org/devel/calendar.phps
<?php
/*  Copyright by Gao Weibin, Do NOT use this in commerce without my agreement,   Please tell me before modify this program.
版权所有,没有我的同意请不要用于商业目的或传播
没有我的同意请不要更改此程序。
高伟斌 2003年1月6日
E-Mail: gaowb@gwssi.com.cn

Modified by Sebastien Bruggeman
E-mail : seba@ulyssis.org
URL : http://seba.ulyssis.org/devel/php.php


*/
?>

<?php
class NL {
   var $good = TRUE;
   var $hind;
   var $day;

   function NL($Year, $Mon, $Day, $sDay) {
      $TianGan = array("&#x7532;","&#x4E59;","&#x4E19;","&#x4E01;","&#x620A;","&#x5DF1;","&#x5E9A;","&#x8F9B;","&#x58EC;","&#x7678;");   //10 heavenly stems
      $DiZhi = array("&#x5B50;","&#x4E11;","&#x5BC5;","&#x536F;","&#x8FB0;","&#x5DF3;","&#x5348;","&#x672A;","&#x7533;","&#x9149;","&#x620C;","&#x4EA5;");  //12 earthly branches
      $ShuXiang = array("&#x9F20;","&#x725B;","&#x864E;","&#x5154;","&#x9F8D;","&#x86C7;","&#x99AC;","&#x7F8A;","&#x7334;","&#x96DE;","&#x72D7;","&#x8C6C;");  //(animal) sign of the year
      $DayName = array("&#x521D;&#x4E00;","&#x521D;&#x4E8C;","&#x521D;&#x4E09;","&#x521D;&#x56DB;","&#x521D;&#x4E94;","&#x521D;&#x516D;","&#x521D;&#x4E03;","&#x521D;&#x516B;","&#x521D;&#x4E5D;","&#x521D;&#x5341;","&#x5341;&#x4E00;","&#x5341;&#x4E8C;","&#x5341;&#x4E09;","&#x5341;&#x56DB;","&#x5341;&#x4E94;","&#x5341;&#x516D;","&#x5341;&#x4E03;","&#x5341;&#x516B;","&#x5341;&#x4E5D;","&#x4E8C;&#x5341;","&#x5EFF;&#x4E00;","&#x5EFF;&#x4E8C;","&#x5EFF;&#x4E09;","&#x5EFF;&#x56DB;","&#x5EFF;&#x4E94;","&#x5EFF;&#x516D;","&#x5EFF;&#x4E03;","&#x5EFF;&#x516B;","&#x5EFF;&#x4E5D;","&#x4E09;&#x5341;"); //lunar name of the day
      $MonName = array("&#x6B63;","&#x4E8C;","&#x4E09;","&#x56DB;","&#x4E94;","&#x516D;","&#x4E03;","&#x516B;","&#x4E5D;","&#x5341;","&#x5341&#x6B63","&#x81D8;"); //lunar name of the month
      $NongLi = array(0x200001, 0x17A9DD, 0x36A830, 0x2E9026, 0x36A55B, 0x35242D, 0x2A5422,
       0x2A6D17, 0x14B42A, 0x2AB41E, 0x2AD894, 0x36A826, 0x3B919D, 0x3A902F, 0x352824, 0x155559,
       0x2A5C2B, 0x155820, 0x1574D5, 0x2B5428, 0x2F4A1E, 0x1D4831, 0x3A9426, 0x2CA95C, 0x192C2E,
       0x2A6C22, 0x2A9B18, 0x15A82B, 0x2D6420, 0x2EA895, 0x1D4828, 0x36959D, 0x2C9430, 0x292C24,
       0x292F59, 0xAB42C,  0x15A822, 0x16D496, 0x36A429, 0x3A4BDF, 0x3A4832, 0x349426, 0x34B55B,
       0x29582E, 0xAD823,  0x2B5717, 0xDA82B,  0x3AA420, 0x3D2896, 0x3A4828, 0x3A999D, 0x14AC2F,
       0x14AC24, 0x25D959, 0x2D682C, 0xDA822,  0x1D86D7, 0x1D2429, 0x2C4FDE, 0x2A4C31, 0x14AC26,
       0x146F9A, 0x2AB42D, 0x158823, 0x369718, 0x17482B, 0x2D2420, 0x352C95, 0x2A5428, 0x2AB5DC,
       0x14D82F, 0x2AB424, 0x2B2B5A, 0x17482C, 0x369421, 0x3A8AD7, 0x35282A, 0x16561E, 0x2A5C30,
       0x155826, 0x15D59B, 0x2B542D, 0x1B4823, 0x1D5518, 0x3A942B, 0x192820, 0x193CD4, 0x2A6C27,
       0x2B69DD, 0x15A82F, 0x2DA424, 0x2EC95A, 0x2D482D, 0x2C9421, 0x2CAD16, 0x292C29, 0x2AAE1E,
       0xAB430,  0x15B425, 0x16A79B, 0x36A42E, 0x364823, 0x3A5518, 0x34942B, 0x3936A0, 0x295832,
       0xAD827,  0xBD59C,  0x1B542F, 0x3B2424, 0x3D495A, 0x3A482D, 0x349822, 0x14B8D6, 0x295C28,
       0x2B5A1E, 0xD6831,  0x1B5425, 0x2DA55B, 0x1D242E, 0x1A4C23, 0x2A6D17, 0x14AC2A, 0x296C1F,
       0x2AB895, 0x15A827, 0x3755DC, 0x174830, 0x2D2425, 0x354D59, 0x2A542C, 0x14B421, 0x157516,
       0x2AB428, 0x2EAA5E, 0x174831, 0x369426, 0x3A299B, 0x35282E, 0x325423, 0x2A7918, 0x15582A,
       0x2AD41F, 0x2B6895, 0x1B4828, 0x1D959C, 0x1C942F, 0x192C24, 0x195D59, 0x32AC2B, 0x156821,
       0x15B8D6, 0x2DA429, 0x2F49DE, 0x2D4831, 0x2C9426, 0x342F9B, 0x292C2D, 0x12AC22, 0xAED57,
       0x16B42A, 0x2DA81F, 0x36A895, 0x364828, 0x3A95DD, 0x34942F, 0x295424, 0x293759, 0x12D82C,
       0x16D420, 0x1B4AD6, 0x3B2429, 0x3E4A1F, 0x3A4831, 0x349826, 0x145B9B, 0x295C2D, 0x135822,
       0xD9717,  0x1D542A, 0x1D2420, 0x1D2CD4, 0x1A4C27, 0x2AADDC, 0x14AC2F, 0x296C23, 0x2AE959,
       0x15A82C, 0x2D9421, 0x2EA916, 0x2D2829, 0x36561E, 0x2A5431, 0x14B425, 0x15B59A, 0x2AD42D,
       0x16A823, 0x175517, 0x36942A, 0x352820, 0x3934D5, 0x325827, 0x3339DC, 0x15582F, 0x2AD424,
       0x2B4B59, 0x1B482C, 0x3A9421, 0x1CA917, 0x192C28, 0x1A5E1D, 0x12AC30, 0x156C25, 0x155B9A,
       0x2DA82D, 0x1D4823, 0x2E5518, 0x2C942A, 0x2A2C1F, 0x293C94, 0x12AC27,);
      $ChinaDay = array("0101"=>"&#x6625;&#x7BC0;","0115"=>"&#x5143;&#x5BB5;&#x7BC0;","0505"=>"&#x7AEF;&#x5348;&#x7BC0;","0707"=>"&#x4E03;&#x5915;&#x60C5;&#x4EBA;&#x7BC0;","0715"=>"&#x4E2D;&#x5143;&#x7BC0;","0815"=>"&#x4E2D;&#x79CB;&#x7BC0;","0909"=>"&#x91CD;&#x967D;&#x7BC0;","1208"=>"&#x81D8;&#x516B;&#x7BC0;","1224"=>"&#x5C0F;&#x5E74;","0100"=>"&#x9664;&#x5915;");
      $goodDay = array("&#x7533;&#x9149;&#x5B50;&#x4E11;&#x536F;&#x5348;","&#x620C;&#x4EA5;&#x5BC5;&#x536F;&#x5DF3;&#x7533;","&#x5B50;&#x4E11;&#x8FB0;&#x5DF3;&#x672A;&#x620C;","&#x5BC5;&#x536F;&#x5348;&#x672A;&#x9149;&#x5B50;","&#x8FB0;&#x5DF3;&#x7533;&#x9149;&#x4EA5;&#x5BC5;","&#x5348;&#x672A;&#x620C;&#x4EA5;&#x4E11;&#x8FB0;");
      $advice = array("&#x7532;&#x5B50;&#x4E59;&#x4E11;&#x4E19;&#x5BC5;&#x5DF1;&#x5DF3;&#x5E9A;&#x5348;&#x8F9B;&#x672A;&#x7532;&#x620C;&#x4E59;&#x4EA5;&#x4E19;&#x5B50;&#x4E59;&#x536F;&#x58EC;&#x5B50;&#x7678;&#x672A;&#x7532;&#x7533;&#x5E9A;&#x5BC5;&#x8F9B;&#x536F;&#x4E59;&#x672A;&#x620A;&#x5BC5;&#x5E9A;&#x5B50;&#x7678;&#x536F;&#x4E19;&#x5348;&#x58EC;&#x5B50;&#x7532;&#x5BC5;&#x4E59;&#x536F;&#x5DF1;&#x672A;&#x5E9A;&#x7533;&#x8F9B;&#x9149;",
         "&#x8F9B;&#x672A;&#x4E19;&#x5B50;&#x4E01;&#x4E11;&#x58EC;&#x5348;&#x7678;&#x672A;&#x7532;&#x7533;&#x8F9B;&#x536F;&#x4E59;&#x672A;&#x58EC;&#x8FB0;&#x5E9A;&#x5B50;&#x620A;&#x7533;&#x58EC;&#x5B50;&#x7678;&#x536F;&#x4E01;&#x672A;&#x4E59;&#x672A;&#x7532;&#x5BC5;&#x4E59;&#x536F;&#x8F9B;&#x9149;",
         "&#x8F9B;&#x672A;&#x58EC;&#x7533;&#x7678;&#x9149;&#x4E01;&#x4E11;&#x4E59;&#x536F;&#x58EC;&#x5348;&#x7532;&#x7533;&#x4E01;&#x4EA5;&#x58EC;&#x8FB0;&#x4E59;&#x672A;&#x58EC;&#x5BC5;&#x7532;&#x8FB0;&#x4E59;&#x5DF3;&#x4E19;&#x5348;&#x5DF1;&#x9149;&#x5E9A;&#x620C;&#x8F9B;&#x4EA5;&#x4E19;&#x8FB0;&#x5DF1;&#x672A;&#x5E9A;&#x7533;&#x8F9B;&#x9149;");
      $md = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
      $days = $Day;
      for($i = 1; $i < $Mon; $i++)
         $days += $md[$i-1];
      if (($Mon > 2) && ((($Year%4==0) && ($Year%100!=0)) || ($Year%400==0)))
         $days++;
      $data = $NongLi[$Year-1880] % 64;
      $diff = $days - $data - 1;
      $data = floor($NongLi[$Year-1880]/64);

      $vday = 0;
      $i = 0;

      if ($diff > 0) {
         $data %= 16;
         if ($data > 0)
            if ($data > 10) {
               $largeLeap = TRUE;
               $leapMon = $data - 8;
            } else
               $leapMon = $data;
         else
            $leapMon = 0;
         $data = floor($NongLi[$Year-1880]/1024);
         while($i < 12) {
            if (($leapMon > 0) && ($leapMon == $i)) {
               $vday += 29;
               if (isset($largeLeap))
                  $vday++;
               if ($vday > $diff) {
                  $i--;
                  $leapFlag = TRUE;
                  $vday -= 29;
                  if (isset($largeLeap))
                     $vday--;
                  break;
               }
            }
            $vday += 29;
            if (($data%2) == 1)
               $vday++;
            if ($vday > $diff) {
               $vday -= 29;
               if (($data%2) == 1)
                  $vday--;
               break;
            }
            $i++;
            $data = floor($data/2);
         }
         $diff -= $vday;
      } else if ($diff < 0) {
         $Year--;
         $i = 11;
         $data = floor($NongLi[$Year-1880]/0x100000);
         $diff += 29;
         if ($data > 1)
            $diff++;
         if ($diff < 0) {
            $diff += 29;
            if (($data%2) == 1)
               $diff++;
            $i--;
         }
         $lastFlag = TRUE;
      }

      $this->hint = "&#x3010;".$ShuXiang[($Year-4)%12]."&#x3011;".$TianGan[($Year-4)%10].$DiZhi[($Year-4)%12]."&#x5E74;";
      $mons = ($Year-1881)*12 + $Mon;
      if (isset($lastFlag))
         $mons += 12;
      if ($Day < $sDay)
         $mons--;
      $this->hint .= $TianGan[($mons+4)%10].$DiZhi[$mons%12]."&#x6708;";

      $key = $Year;
      if (isset($lastFlag))
         $key++;
      for($j = 1881; $j < $key; $j++) {
         $days += 365;
         if ((($j%4==0) && ($j%100!=0)) || ($j%400==0))
            $days++;
      }
      $key = $TianGan[$days%10].$DiZhi[($days+6)%12];
      $this->hint .= $key."&#x65E5;";

      if (isset($leapFlag))
            $this->day .= "&#x958F";
         $this->day .=
$MonName[$i]."(".($i+1).")"."&#x6708;".$DayName[$diff]."&#x65E5;";

      if ($i++ > 9)
         $key = strval($i);
      else
         $key = "0".strval($i);

      if ($diff++ > 9)
         $key .= $diff;
      else
         $key .= "0".$diff;

      if (($i == 12) && ($diff > 28))
         if ((($diff==29) && ($NongLi[$Year-1880]<0x200000)) || ($diff==30))
            $key = "0100";

      if (array_key_exists($key, $ChinaDay))
         $this->day .= " :: ".$ChinaDay[$key];
   }
}

$Year = intval($_GET['Year']);
$Mon = intval($_GET['Mon']);

if (($Year<1881) || ($Year>2100) || ($Mon<1) || ($Mon>12)) {
   $Year = intval(strftime("%Y"));
   $Mon = intval(date("n"));
}

$day = 1;
$md = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
for($i = 1; $i < $Mon; $i++)
   $day += $md[$i-1];
if (($Mon > 2) && ((($Year%4==0) && ($Year%100!=0)) || ($Year%400==0)))
   $day++;
for($i = 1881; $i < $Year; $i++) {
   $day += 365;
   if ((($i%4==0) && ($i%100!=0)) || ($i%400==0))
      $day++;
}
$wn = ($day+5) % 7;

$lastday = $md[$Mon-1];
if (($Mon == 2) && ((($Year%4==0) && ($Year%100!=0)) || ($Year%400==0)))
   $lastday++;
   
/* Give the month and day as 4 digits and then the name of the (lunar) holiday you want to add. */
$Holiday =
array("0101"=>"&#x5143;&#x65E6;","0202"=>"&#x6FD5;&#x5730;&#x65E5;","0214"=>"&#x60C5;&#x4EBA;&#x7BC0;","0308"=>"&#x5A66;&#x5973;&#x7BC0;",
   "1225"=>"&#x8056;&#x895;&#x7BC0;");
$sData = array(0,21208,42467,63836,85337,107014,128867,150921,173149,195551,218072,240693,
   263343,285989,308563,331033,353350,375494,397447,419210,440795,462224,483532,504758);

$sDay[0] = floor((($Year-1881)*31556925974.7+$sData[2*($Mon-1)]*60000+386804876)/86400000)-$day+2;
$sDay[1] = floor((($Year-1881)*31556925974.7+$sData[2*($Mon-1)+1]*60000+386804876)/86400000)-$day+2;

if (function_exists("easter_days")) {
   $eDay = easter_days($Year);
   if ($eDay > 10) {
      $eDay -= 10;
      $eMon = 4;
   } else {
      $eDay += 21;
      $eMon = 3;
   }
}

for($i = 1; $i <= $lastday; $i++) {
   $nongli = new NL($Year, $Mon, $i, $sDay[0]);
   if (date(d) == $i) {
    echo $nongli->hint;     
    echo " / ".$nongli->day;
       if ($Mon < 10)
          $key = "0".$Mon;
       else
          $key = $Mon;
       if ($i < 10)
          $key .= "0".$i;
       else
          $key .= $i;
       if (array_key_exists($key, $Holiday))
          echo " :: ".$Holiday[$key];
    } // end if
} //end for

?>
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|湘里妹子学术网 ( 粤ICP备2022147245号 )

GMT++8, 2025-5-2 02:46 , Processed in 0.069913 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表