PHP 旧暦グレゴリオ暦変換
- /*
- 雲南省曲清師範大学コンピューターサイエンス工学部、Yang Haixi 著
- 2009-9-3
- */
- class Lunar
- {
- private $_SMDay = array (1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);//グレゴリオ暦の月の日数を定義します
- private $_LStart = 1950;/ /旧暦は 1950 年から始まります
- private $_LMDay = array(
- //差: 旧暦の最初の月の 1 日からグレゴリオ暦の 1 月 1 日までの日数、1 ~ 12: の数太陰月の日数; 閏: 閏月がある場合、その月の通常の日数を記録します
- // 差 1 2 3 4 5 6 7 8 9 10 11 12 閏
- array(47,29,30, 30,29,30,30,29,29,30,29,30,29),
- 配列(36,30, 29,30,30,29,30,29,30,29,30,29,30) ,
- array(6,29,30,29,30,59,29,30,30,29,30,29, 30,29), //5月29日閏5月30日
- array(44,29,30,29) ,29,30,30,29,30,30,29,30,29),
- 配列(33,30 ,29,30,29,29,30,29,30,30,29,30,30),
- array(23,29,30,59,29,29,30,29,30,29,30,30 ,30,29), //3 月 29 日 閏 3 月 30日
- array(42,29,30,29, 30,29,29,30,29,30,29,30,30),
- 配列(30, 30,29,30,29,30,29,29,59,30,29,30,29,30) , //8月30日 閏8月29日
- array(48,30,30,30,29,30 ,29,29,30,29,30,29,30),
- array(38,29,30,30,29 ,30,29,30,29,30,29,30,29),
- 配列(27 ,30,29,30,29,30,59,30,29,30,29,30,29,30), //6月30日 閏6月29日
- array(45,30,29,30,29, 30,29,30,30,29,30,29,30),
- array(35,29,30,29,29, 30,29,30,30,29,30,30,29),
- 配列( 24,30,29,30,58,30,29,30,29,30,30,30,29,29), / /4月29日 閏4月29日
- array(43,30,29,30,29 ,29,30,29,30,29,30,30,30),
- array(32,29,30,29,30,29 ,29,30,29,29,30,30,29),
- 配列 (20,30,30,59,30,29,29,30,29,29,30,30,29,30), // 3月30日 閏3月29日
- array(39,30,30,29, 30,30,29,29,30,29,30,29,30),
- array(29,29,30,29,30,30, 29,59,30,29,30,29,30,30) , //7月30日 閏7月29日
- array(47,29,30,29,30,29,30,30,29,30,29,30 ,29)、
- 配列(36,30,29,29 ,30,29,30,30,29,30,30,29,30),
- 配列(26,29,30,29,29,59,30 ,29,30,30,30,29,30,30 ), //5月30日閏5月29日
- array(45,29,30,29,29,30,29,30,29,30,30,29, 30)、
- 配列(33,30,29, 30,29,29,30,29,29,30,30,29,30),
- 配列(22,30,30,29,59,29,30, 29,29,30,30,29,30, 30), //4月30日 閏4月29日
- array(41,30,30,29,30,29,29,30,29,29,30,29,30 ),
- array(30,30,30 ,29,30,29,30,29,59,29,30,29,30,30), //8 月 30 日 閏 8 月 29 日
- array(48,30,29, 30,30,29,30, 29,30,29,30,29,29),
- 配列(37,30,29,30,30,29,30,30,29,30,29,30,29) ,
- array(27,30, 29,29,30,29,60,29,30,30,29,30,29,30), //6 月 30 日 閏 6 月 30日
- array(46,30,29,29) ,30,29,30 ,29,30,30,29,30,30),
- 配列(35,29,30,29,29,30,29,29,30,30,29,30,30),
- array(24,30 ,29,30,58,30,29,29,30,29,30,30,30,29), //4 月 29 日 閏 4 月 29 日
- array(43,30,29,30, 29,29, 30,29,29,30,29,30,30),
- 配列(32,30,29,30,30,29,29,30,29,29,59,30,30,30) , //10 月 30 閏 10 月 29 日
- array(50,29,30,30,29,30,29,30,29,29,30,29,30),
- array(39,29,30,30, 29,30 ,30,29,30,29,30,29,29),
- 配列(28,30,29,30,29,30,59,30,30,29,30,29,29,30) , // 6月30日 閏6月29日
- array(47,30,29,30,29,30,29,30,30,29,30,30,29),
- array(36,30,29,29,30 、29,30,29,30,29,30,30,30),
- 配列(26,29,30,29,29,59,29,30,29,30,30,30,30,30), / /5月30日 閏5月29日
- array(45,29,30,29,29,30,29,29,30,29,30,30,30),
- array(34,29,30,30,29 , 29,30,29,29,30,29,30,30),
- 配列(22,29,30,59,30,29,30,29,29,30,29,30,29,30), / /3月30日 閏3月29日
- array(40,30,30,30,29,30,29,30,29,29,30,29,30),
- array(30,29,30,30, 29,30 ,29,30,59,29,30,29,30,30), //8月30日閏8月29日
- array(49,29,30,29,30,30,29,30,29 ,30,30, 29,29)、
- 配列(37,30,29,30,29,30,29,30,30,29,30,30,29),
- 配列(27,30,29,29,30,58, 30,30,29,30,30,29,30,29), //5月29日 閏5月29日
- array(46,30,29,29,30,29,29,30, 29,30,30,30 ,29)、
- 配列(35,30,30,29,29,30,29,29,30,29,30,30,29),
- 配列(23,30,30,29,59,30,29 ,29,30,29,30,29,30,30), //4月30日 閏4月29日
- array(42,30,30,29,30,29,30,29 ,29,30,29,30, 29)、
- 配列(31,30,30,29,30,30,29,30,29,29,30,29,30),
- 配列(21,29,59 ,30,30,29,30, 29,30,29,30,29,30,30), //2月30日 閏2月29日
- array(39,29,30,29,30,29,30, 30,29,30,29,30,29 ),
- array(28,30,29,30,29,30,29,59,30,30,29,30,30,30), //7月30日閏7月29日
- array(48,29,29, 30,29,29,30,29,30,30,30,29,30),
- 配列(37,30,29,29,30,29,29 ,30,29,30,30,29,30) ,
- array(25,30,30,29,29,59,29,30,29,30,29,30,30,30), //5月30日閏5月29日
- array(44,30,29,30) ,29,30,29,29,30,29,30,29,30),
- 配列(33,30,29,30,30,29, 30,29,29,30,29,30,29),
- array(22,30,29,30,59,30,29,30,29,30,29,30,29,30), //4月30閏4月29日
- array(40,30,29,30) ,29,30,30,29,30,29,30,29,30),
- 配列(30,29,30,29,30,29 ,30,29,30,59,30,29,30,30 ), //9月30日閏9月29日
- 配列(49,29,30,29,29,30,29,30,30,30,29,30,29),
- 配列(38,30,29,30,29,29,30,29,30, 30,29,30,30),
- array(27,29,30,29,30,29,59,29,30,29,30,30,30,29), //6 月 29 日 閏 6 月 30 日
- 配列(46,29,30,29,30,29,29,30,29,30,29,30,30),
- 配列(35,30,29,30,29,30,29,29,30 ,29 ,29,30,30),
- array(24,29,30,30,59,30,29,29,30,29,30,29,30,30), //4月30日閏4月29日
- array( 42,29,30,30,29,30,29,30,29,30,29,30,29),
- 配列(31,30,29,30,29,30,30,29, 30,29, 30,29,30),
- array(21,29,59,29,30,30,29,30,30,29,30,29,30,30), //2月30日閏日月29
- array( 40,29,30,29,29,30,29,30,30,29,30,30,29),
- 配列(28,30,29,30,29,29,59,30 ,29,30, 30,30,29,30), //6月30日 閏6月29日
- array(47,30,29,30,29,29,30,29,29,30,30,30, 29),
- array(36) ,30,30,29,30,29,29,30,29,29,30,30,29),
- 配列(25,30,30,30,29,59,29, 30,29,29,30 ,30,29,30), //5月30日閏5月29日
- array(43,30,30,29,30,29,30,29,30,29,29,30 ,30),
- array(33, 29,30,29,30,30,29,30,29,30,29,30,29),
- 配列(22,29,30,59,30,29,30 ,30,29,30,29, 30,29,30), //3月30日 閏3月29日
- array(41,30,29,29,30,29,30,30,29,30,30, 29,30),
- array(30,29) ,30,29,29,30,29,30,29,30,30,59,30,30), //11月30日閏11月29日
- 配列(49,29,30,29,29,30,29, 30,29,30,30,29,30),
- 配列(38,30,29,30,29,29,30,29,29,30 ,30,29,30),
- 配列(27,30, 30,29,30,29,59,29,29,30,29,30,30,29), //6月29日閏6月30日
- array(45,30,30,29,30,29,29,30 ,29,29,30,29,30),
- 配列(34,30,30,29,30,29,30,29,30, 29,29,30,29),
- 配列(23,30,30 ,29,30,59,30,29,30,29,30,29,29,30), //5月30日 閏5月29日
- array(42,30,29,30,30,29,30,29, 30,30,29,30,29)、
- 配列(31,29,30,29,30,29,30,30,29 ,30,30,29,30),
- 配列(21,29,59, 29,30,29,30,29,30,30,29,30,30,30), //2月30日閏2月29日
- array(40,29,30,29,29,30,29,29,30 ,30,29,30,30),
- array(29,30,29,30,29,29,30,58, 30,29,30,30,30,29), //7月29日閏7月29日
- 配列(47,30,29,30,29,29,30,29,29,30,29,30,30 ),
- 配列(36,30,29,30,29,30,29,30,29, 29,30,29,30),
- array(25,30,29,30,30,59,29,30 ,29,29,30,29,30,29), //5月29日閏5月30日
- 配列(44,29,30,30,29,30,30,29,30,29,29,30,29),
- 配列(32,30,29,30,29,30,30,29,30,30 ,29,30,29),
- array(22,29,30,59,29,30,29, 30,30,29,30,30,29,29), //3 月 29 日 閏 3 月 30 日
- );
- //閏年かどうか
- private function IsLeap Year($A Year){
- return ($Ayear % 4 == 0) && (($Ayear % 100 != 0) || ($Ayear % 400 == 0) ));
- }
- //グレゴリオ暦の月の日数 (年: 年; 月: 月)
- プライベート関数 GetSMon( $year,$month)
- {
- if($this->IsLeap Year ($year) && $month == 2)
- return 29;
- else
- return $this->_SMDay[$month];
- }
- //旧暦名変換
- private function LyearName($year)
- {
- $Name = array("ゼロ"、"一"、"二"、"三"、"四"、"五"、"六"、"七"、"八"、"九");
- for($ i=0;$i for($k=0;$k if($year[ $i]==$k)
- $tmp.=$Name[ $k];
- return $tmp;
- }
-
- プライベート関数 LMonName($month)
- {
- if($month >=1 && $month <=12 )
- {
- $Name = array( 1=> ;"正"、"二"、"三"、"四"、"五"、"六"、"七"、"八"、"九"、"十"、"十一"、"十二");
- return $Name[$month];
- }
- return $month;
- }
-
- プライベート関数 LDayName($day)
- {
- if( $day >=1 && $day <=30 )
- {
- $ Name = array( 1 =>
- "中学1日目"、"中学2日目"、"中学3日目"、"中学4日目"、"中学5日目"高校" "、"旧月 6 日"、"旧月 7 日"、"旧月 8 日"、"旧月 9 日"、"旧月 10 日"旧暦の月"、
- "十一"、"十二"、"十三"、"十四"、"十"、"五"、"十六"、"十七"、"十八"、"十九"、"二十"、
- " 21」、「22」、「23」、「24」、「」、「25」、「26」、「27」、「28」、「20」 -nine", "Thirty"
- );
- return $Name[$day];
- }
- return $day;
- }
-
- //グレゴリオ暦を旧暦に変換します (Sdate: グレゴリオ暦の日付)
- public function S2L($date)
- {
- list($year, $month, $day) =explode("-", $date);
- if($ year <= 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false;
- //クエリ日からの日数を取得します。今年の 1 月 1 日
- $date1 = strtotime($year."-01-01");//今年の 1 月 1 日
- $date2 = strtotime($year."-".$month."-" .$day);
- $days=round (($date2-$date1)/3600/24);
- $days += 1;
- // 対応する年間太陰暦データを取得し、配列 Larray に変換します
- $ Larray = $this->_LMDay[$year - $this- >_LStart];
- if($days <= $Larray[0])
- {
- $Lyear = $year - 1;
- $days = $ Larray[0] - $days;
- $Larray = $this- >_LMDay[$Lyear - $this->_LStart];
- if($days < $Larray[12])
- {
- $Lmonth = 12 ;
- $Lday = $Larray[12] - $days;
- }
- else
- {
- $Lmonth = 11;
- $days = $days - $Larray[12];
- $Lday = $Larray[11] - $ days;
- }
- }
- else
- {
- $Lyear = $ year;
- $days = $days - $Larray[0];
- for($i = 1;$i <= 12;$i++)
- {
- if($days > $Larray[$i]) $ days = $days - $Larray[$i];
- else
- {
- if ($days > 30){
- $days = $days - $Larray [13];
- $Ltype = 1;
- }
-
- $ Lmonth = $i;
- $Lday = $days;
- Break;
- }
- }
- }
- return mktime(0, 0, 0, $Lmonth, $ Lday, $Lyear);
- //$Ldate = $Lyear. "-".$Lmonth."-".$Lday;
- //$Ldate = $this->LyearName($Lyear)." Year". $this->LMonName($Lmonth)."Month". $this->LDayName($Lday);
- //if($Ltype) $Ldate.="(Leap)";
- //return $Ldate ;
- }
- //旧暦をグレゴリオ暦に変換します (日付: 旧暦; タイプ: 閏月かどうか)
- public function L2S($date,$type = 0)
- {
- list($year, $month , $day) = split("-",$date);
- if($year < = 1951 || $month <= 0 || $day <= 0 || $year >= 2051 ) return false;
- $Larray = $this->_LMDay[$year - $this->_LStart ];
- if($type == 1 && count($Larray)<=12 ) return false;//リクエスト閏月をクエリしますが、閏月が見つかりません
- //クエリ対象の太陰暦が閏月で、その年の太陰暦配列に閏月が含まれる場合 データを取得します
- if($Larray[$month]>30 && $type == 1 && count($Larray) >=13) $day = $Larray[13] + $day;
- //年を取得 旧暦の日付からグレゴリオ暦の 1 月 1 日までの日数
- $days = $day;
- for($i=0;$i $days += $Larray[$i];
- //旧暦の日付をクエリする場合は、グレゴリオ暦の 1 月 1 日からの 1 年
- if($days > 366 || ($this->GetSMon($month,2)!=29 && $days>365 ))
- {
- $Syear = $year +1;
- if($this->GetSMon($month,2)!=29)
- $days-=366;
- else
- $days-=365;
- if($days > $this-> _SMDay[1])
- {
- $Smonth = 2;
- $Sday = $days - $this->_SMDay[1];
- }
- else
- {
- $Smonth = 1;
- $Sday = $days;
- }
- }
- else
- {
- $Syear =$year;
- for($i=1;$i<=12;$i++)
- {
- if($days > $this- >GetSMon($Syear, $i))
- $days-=$this->GetSMon($Syear,$i);
- else
- {
- $Smonth = $i;
- $Sday = $days;
- ブレーク ;
- }
- }
- }
- return mktime(0, 0, 0, $Smonth, $Sday, $Syear);
- //$Sdate = $Syear."-".$Smonth."-".$Sday
- //return $Sdate;
- }
- }
- ?>
コードをコピー
- require_once 'Lunar.php';
- $today = date("Y-m-d");
- $lunar = new Lunar();
- //グレゴリオ暦から太陰暦へ
- $nl = date( "Y-m-d" ",$lunar->S2L($today));
- //太陰暦をグレゴリオ暦に変換します
- $gl = date("Y-m-d",$lunar->L2S($nl));
- echo "今日のグレゴリオ暦は: $ today
"; - echo "太陰暦への変換は: $nl
"; - echo "グレゴリオ暦への変換は: $gl
";
- ?>
コードをコピー
|