これは、グレゴリオ暦と旧暦の変換、中国の日付形式への変換、旧暦間の日数の計算、旧暦の年に応じた星座の取得、および取得を含む実践的な PHP 日付と時刻の操作クラスです。旧暦の月の日数、および旧暦の各年の日数を取得する 閏月を取得し、旧暦の日付と旧暦の最初の月の初日の間の日数を計算します。グレゴリオ暦(太陽暦)の日付の間の日数、旧暦の1月1日からの日数に基づいて旧暦の日付を計算、天の幹と地の支の暦を取得するなど、PHPの日付操作クラス: Lunar .class.php コードは次のとおりです:
001
002クラスルナー{
003 var $MIN_YEAR = 1891;
004 var $MAX_YEAR = 2100;
005 var $lunarInfo = array(
006 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)、配列(0,2,13,59728)、
007 配列(0,2,2,27296),配列(3,1,22,44368),配列(0,2,10,43856),配列(8,1,30,19304),配列(0, 2,19,19168)、配列(0,2,8,42352)、
008 配列(5,1,29,21096),配列(0,2,16,53856),配列(0,2,4,55632),配列(4,1,25,27304),配列(0, 2,13,22176)、配列(0,2,2,39632)、
009 配列(2,1,22,19176),配列(0,2,10,19168),配列(6,1,30,42200),配列(0,2,18,42192),配列(0, 2,6,53840)、配列(5,1,26,54568)、
010 配列(0,2,14,46400),配列(0,2,3,54944),配列(2,1,23,38608),配列(0,2,11,38320),配列(7, 2,1,18872)、配列(0,2,20,18800)、
011 配列(0,2,8,42160),配列(5,1,28,45656),配列(0,2,16,27216),配列(0,2,5,27968),配列(4, 1,24,44456)、配列(0,2,13,11104),
012 配列(0,2,2,38256),配列(2,1,23,18808),配列(0,2,10,18800),配列(6,1,30,25776),配列(0, 2,17,54432)、配列(0,2,6,59984)、
013 配列(5,1,26,27976),配列(0,2,14,23248),配列(0,2,4,11104),配列(3,1,24,37744),配列(0, 2,11,37600)、配列(7,1,31,51560)、
014 配列(0,2,19,51536),配列(0,2,8,54432),配列(6,1,27,55888),配列(0,2,15,46416),配列(0, 2,5,22176)、配列(4,1,25,43736)、
015 配列(0,2,13,9680),配列(0,2,2,37584),配列(2,1,22,51544),配列(0,2,10,43344),配列(7, 1,29,46248)、配列(0,2,17,27808)、
016 配列(0,2,6,46416),配列(5,1,27,21928),配列(0,2,14,19872),配列(0,2,3,42416),配列(3, 1,24,21176)、配列(0,2,12,21168)、
017 配列(8,1,31,43344),配列(0,2,18,59728),配列(0,2,8,27296),配列(6,1,28,44368),配列(0, 2,15,43856)、配列(0,2,5,19296)、
018 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)、配列(7,1,30,23208)、
019 配列(0,2,17,22176),配列(0,2,6,38608),配列(5,1,27,19176),配列(0,2,15,19152),配列(0, 2,3,42192)、配列(4,1,23,53864)、
020 配列(0,2,11,53840),配列(8,1,31,54568),配列(0,2,18,46400),配列(0,2,7,46752),配列(6, 1,28,38608)、配列(0,2,16,38320)、
021 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)、配列(0,2,9,27968)、
022 配列(6,1,29,44448),配列(0,2,17,43872),配列(0,2,6,38256),配列(5,1,27,18808),配列(0, 2,15,18800)、配列(0,2,4,25776)、
023 配列(3,1,23,27216),配列(0,2,10,59984),配列(8,1,31,27432),配列(0,2,19,23232),配列(0, 2,7,43872)、配列(5,1,28,37736)、
024 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)、配列(2,1,22,23208)、
025 配列(0,2,9,22176),配列(7,1,29,43736),配列(0,2,18,9680),配列(0,2,7,37584),配列(5, 1,26,51544)、配列(0,2,14,43344)、
026 配列(0,2,3,46240),配列(4,1,23,46416),配列(0,2,10,44368),配列(9,1,31,21928),配列(0, 2,19,19360)、配列(0,2,8,42416)、
027 配列(6,1,28,21176),配列(0,2,16,21168),配列(0,2,5,43312),配列(4,1,25,29864),配列(0, 2,12,27296)、配列(0,2,1,44368)、
028 配列(2,1,22,19880),配列(0,2,10,19296),配列(6,1,29,42352),配列(0,2,17,42208),配列(0, 2,6,53856)、配列(5,1,26,59696)、
029 配列(0,2,13,54576),配列(0,2,3,23200),配列(3,1,23,27472),配列(0,2,11,38608),配列(11, 1,31,19176)、配列(0,2,19,19152)、
030 配列(0,2,8,42192),配列(6,1,28,53848),配列(0,2,15,53840),配列(0,2,4,54560),配列(5, 1,24,55968)、配列(0,2,12,46496)、
031 配列(0,2,1,22224),配列(2,1,22,19160),配列(0,2,10,18864),配列(7,1,30,42168),配列(0, 2,17,42160)、配列(0,2,6,43600)、
032 配列(5,1,26,46376),配列(0,2,14,27936),配列(0,2,2,44448),配列(3,1,23,21936),配列(0, 2,11,37744)、配列(8,2,1,18808)、
033 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)、配列(4,1,24,43872)、
034 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)、配列(0,2,17,54432)、
035 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)、配列(0,2,11,21200)、
036 配列(8,1,31,43352),配列(0,2,19,43344),配列(0,2,7,46240),配列(6,1,27,46416),配列(0, 2,15,44368)、配列(0,2,5,21920)、
037 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)、配列(7,1,29,29336)、
038 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)、配列(4,1,24,21104),
039 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)、配列(0,2,15,22224)、
040 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),配列(0,2,9,54560)
041 );
042 /**
043 * 太陽暦を太陰暦に変換します
044 * @param yearグレゴリオ暦年
045 * @param month グレゴリオ暦の月
046 * @param date グレゴリオ暦の日
047*/
048 function ConvertSolarToLunar($year,$month,$date){
049 //デバッガー;
050 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
051 if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
052 return array(1891,'正月','初一','辛卯',1,1,'兔');
053 }
054 return $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));
055 }
056 function ConvertSolarMonthToLunar($year,$month) {
057 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
058 if($year==$this->MIN_YEAR&&$month<=2&&$date<=9){
059 return array(1891,'正月','初一','辛卯',1,1,'兔');
060 }
061 $month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
062 $dd = $month_days_ary[$month];
063 if($this->isLeap Year($year) && $month == 2) $dd++;
064 $lunar_ary = array();
065 for ($i = 1; $i < $dd; $i++) {
066 $array = $this->getLunarByBetween($year,$this->getDaysBetweenSolar($year, $month, $i, $yearData[1],$yearData[2]));
067 $array[] = $year 。 「-」。 $month 。 「-」。 $i;
068 $lunar_ary[$i] = $array;
069 }
070 return $lunar_ary;
071 }
072 /**
073 * 閏年かどうかを判定します
074 * @param year
075*/
076 関数 isLeapyear($year){
077 return (($year%4==0 && $year%100 !=0) || ($year%400==0));
078 }
079 /**
080 * 幹と枝の年を取得します
081 * @param year
082*/
083 function getLunar YearName($year){
084 $sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');
085 $earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午' 、'未');
086 $year = $year.'';
087 return $sky[$year{3}].$earth[$year%12];
088 }
089 /**
090 * 旧暦に応じて星座を取得します
091 * @param年旧暦
092*/
093 function get YearZodiac($year){
094 $zodiac = array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马' 、'羊');
095 return $zodiac[$year%12];
096 }
097 /**
098 * 太陰暦を太陽暦に変換します
099 * @param年 旧暦-年
100 * @param month 旧暦 - 月、閏月の処理: たとえば、5月に閏月がある場合、2番目の5月は6月となり、旧暦の13ヶ月に相当しますが、場合によってはその数が13 か月目の日数は 0 です
101 * @param date 旧暦日
102*/
103 function ConvertLunarToSolar($year,$month,$date){
104 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR];
105 $between = $this->getDaysBetweenLunar($year,$month,$date);
106 $res = mktime(0,0,0,$yearData[1],$yearData[2],$year);
107 $res = date('Y-m-d', $res+$between*24*60*60);
108 $day =explode('-', $res);
109 $year = $day[0];
110 $month= $day[1];
111 $day = $day[2];
112 return array($year, $month, $day);
113 }
114 /**
115 * 新暦の月の日数を取得します
116 * @param year グレゴリオ暦年
117 * @param month グレゴリオ暦の月
118*/
119 function getSolarMonthDays($year,$month){
120 $monthHash = array('1'=>31,'2'=>$this->isLeap Year($year)?29:28,'3'=>31,'4'=> 30、'5'=>31、'6'=>30、'7'=>31、'8'=>31、'9'=>30、'10'=>31、 '11'=>30、'12'=>31);
121 return $monthHash["$month"];
122 }
123 /**
124 * 获取阴历月份の天数
125 * @param year 阴历-年
126 * @param month 阴历-月、从一月开始
127 */
128 function getLunarMonthDays($year,$month){
129 $monthData = $this->getLunarMonths($year);
130 return $monthData[$month-1];
131 }
132 /**
133 * 旧暦の各月の日付の配列を取得します
134 * @param year
135*/
136 function getLunarMonths($year){
137 $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
138 $leapMonth = $yearData[0];
139 $bit = decbin($yearData[3]);
140 for ($i = 0; $i 141 $bitArray[$i] = substr($bit, $i, 1); 142 } 143 for($k=0,$klen=16-count($bitArray);$k
144 array_unshift($bitArray, '0'); 145 } 146 $bitArray = array_slice($bitArray,0,($leapMonth==0?12:13)); 147 for($i=0; $i 148 $bitArray[$i] = $bitArray[$i] + 29; 149 } 150 return $bitArray; 151 } 152 /** 153 * 旧暦の各年の日数を取得します 154 * @param 旧暦年 155*/ 156 function getLunar YearDays($year){ 157 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR]; 158 $monthArray = $this->getLunar YearMonths($year); 159 $len = count($monthArray); 160 return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]); 161 } 162 function getLunar YearMonths($year){ 163 //デバッガー; 164 $monthData = $this->getLunarMonths($year); 165 $res=array(); 166 $temp=0; 167 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR]; 168 $len = ($yearData[0]==0?12:13); 169 for($i=0;$i
170 $temp=0; 171 for($j=0;$j
172 $temp+=$monthData[$j]; 173 } 174 array_push($res, $temp); 175 } 176 return $res; 177 } 178 /** 179 * 閏月を取得します 180 * @param 旧暦年 181*/ 182 function getLeapMonth($year){ 183 $yearData = $this->lunarInfo[$year-$this->MIN_YEAR]; 184 return $yearData[0]; 185 } 186 /** 187 * 旧暦の日付と旧暦の最初の月の初日の間の日数を計算します 188 * @param year 189 * @param month 190 * @param date 191*/ 192 function getDaysBetweenLunar($year,$month,$date){ 193 $yearMonth = $this->getLunarMonths($year); 194 $res=0; 195 for($i=1;$i
196 $res +=$yearMonth[$i-1]; 197 } 198 $res+=$date-1; 199 return $res; 200 } 201 /** 202 * 2つの太陽暦の日付の間の日数を計算します 203 * @param yearグレゴリオ暦 204 * @param cmonth 205 * @param cdate 206 * @param dmonth 旧暦の最初の月に相当する新暦の月 207 * @param ddate 太陰暦の初日に相当する太陽暦の日数 208*/ 209 function getDaysBetweenSolar($year,$cmonth,$cdate,$dmonth,$ddate){ 210 $a = mktime(0,0,0,$cmonth,$cdate,$year); 211 $b = mktime(0,0,0,$dmonth,$ddate,$year); 212 return ceil(($a-$b)/24/3600); 213 } 214 /** 215 ※旧暦の日付は旧暦の1月1日からの日数で計算します 216 * @param yearグレゴリオ暦 217 * @param 間の日数 218*/ 219 function getLunarByBetween($year,$between){ 220 //デバッガー; 221 $lunarArray = array(); 222 $yearMonth=array(); 223 $t=0; 224 $e=0; 225 $leapMonth=0; 226 $m=''; 227 if($between==0){ 228 array_push($lunarArray, $year,'正月','初一'); 229 $t = 1; 230 $e = 1; 231 }その他{ 232 $year = $between>0? $year : ($year-1); 233 $yearMonth = $this->getLunar YearMonths($year); 234 $leapMonth = $this->getLeapMonth($year); 235 $between = $between>0?$between : ($this->getLunar YearDays($year)+$between); 236 for($i=0;$i
237 if($between==$yearMonth[$i]){ 238 $t=$i+2; 239 $e=1; 240休憩; 241 }else if($between
242 $t=$i+1; 243 $e=$between-(empty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1; 244休憩; 245} 246} 247 $m = ($leapMonth!=0&&$t==$leapMonth+1)?('leap'.$this->getCapitalNum($t- 1,true)):$this->getCapitalNum(( $leapMonth!=0&&$leapMonth+1
248 $my_year = $this->to Year($year); 249 array_push($lunarArray,$my_year,$m,$this->getCapitalNum($e,false)); 250} 251 array_push($lunarArray,$this->getLunar YearName($year));//幹と地上の枝 252 array_push($lunarArray,$t,$e); 253 array_push($lunarArray,$this->getyearZodiac($year));//12星座 254 array_push($lunarArray,$leapMonth);//閏月 255 return $lunarArray; 256} 257 //中国年に変換します 258 関数 toyear($year){ 259 $arr = array("zero","one","two","three","four","five","six","seven","eight","nine"); 260 $year_arr = str_split($year); 261 $str = $arr[$year_arr[0]].$arr[$year_arr[1]].$arr[$year_arr[2]].$arr[$year_arr[3]]; 262 return $str; 263 } 264 /** 265 ※数字の旧暦名を取得します 266 * @param num 番号 267 * @param isMonth 月の数字かどうか 268*/ 269 function getCapitalNum($num,$isMonth){ 270 $isMonth = $isMonth false; 271 $dateHash=array('0'=>'','1'=>'one','2'=>'two','3'=>'three','4'= >'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'= >'9','10'=>'10'); 272 $monthHash=array('0'=>'','1'=>'最初の月','2'=>'2月','3'=>'3月','4 ' =>'4月','5'=>'5月','6'=>'6月','7'=>'7月','8'=>'8か月','9 '=>'9 月','10'=>'10 月','11'=>'冬の月','12'=>'陰暦の第 12 月'); 273 $res=''; 274 if($isMonth){ 275 $res = $monthHash[$num]; 276 }その他{ 277 if($num
278 $res = 'chu'.$dateHash[$num]; 279 }else if($num>10&&$num
280 $res = '十'.$dateHash[$num-10]; 281 }else if($num==20){ 282 $res = "20"; 283 }else if($num>20&&$num
284 $res = "忿".$dateHash[$num-20]; 285 }else if($num==30){ 286 $res = "30"; 287 } 288} 289 return $res; 290} 291} 292?> 上記のコードを Lunar.class.php という名前で保存してください。次の例では、このファイルを呼び出し、その使用方法を示します。 01 02require_once("Lunar.class.php");//最初にこのファイルをインクルードします 03$lunar = new Lunar();//オブジェクトを生成する 04$date = $lunar->convertLunarToSolar(2014,2,12) //グレゴリオ暦を太陰暦に変換します 05$date = $lunar->get YearZodiac(2014,2,12) //旧暦に応じた星座を取得します 06$date = $lunar->isLeap Year(2014,2,12) //うるう年を判定します 07//他の関数もこの方法で呼び出されます 08print_r($date); 09//旧暦からグレゴリオ暦に変換する場合、コードは次のようになります: 10$date = $lunar->convertLunarToSolar(2014,2,12) //太陰暦をグレゴリオ暦に変換します 11print_r($date); 12?> 実は内部のいくつかの機能は個別に接続して機能として使用することができ、不要な機能は削除することも可能です。