Kalendar suria kepada fungsi kalendar lunar
1, Idea reka bentuk:
Untuk mengira hari mana dalam kalendar lunar masa tertentu, kita perlu mencari masa rujukan, dan kemudian menggunakan masa rujukan ini untuk mengira masa akan datang. Mula-mula, hitung bilangan hari perbezaan antara masa semasa dan masa rujukan, kemudian dengan mencari bilangan hari dalam setiap tahun kalendar lunar, hitung hari dalam tahun yang sepadan dengan masa semasa, dan akhirnya hitung tarikh yang sesuai. ke bulan itu. . permintaan:
echo "
Panggil kelas berkapsul:
header("Content-type:text/html;charset=utf-8");
class Convert{
private $animals=array("鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪");
private $curData=null;//当前阳历时间
private $ylYeal=0;
private $ylMonth=0;
private $yldate=0;
private $ylDays=0; //当前日期是农历年的第多少天
private $leap=0;//代表润哪一个月
private $leapDays=0;//代表闰月的天数
private $difmonth=0;//当前时间距离参考时间相差多少月
private $difDay=0;//当前时间距离参考时间相差多少天
private $tianGan=array("甲","乙","丙","丁","戊","己","庚","辛","壬","癸");
private $diZhi=array("子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥");
private $dataInfo=array(0x04bd8,0x04ae0,0x0a570,0x054d5,0x0d260,0x0d950,0x16554,0x056a0,0x09ad0,0x055d2,//1900-1909
0x04ae0,0x0a5b6,0x0a4d0,0x0d250,0x1d255,0x0b540,0x0d6a0,0x0ada2,0x095b0,0x14977,//1910-1919
0x04970,0x0a4b0,0x0b4b5,0x06a50,0x06d40,0x1ab54,0x02b60,0x09570,0x052f2,0x04970,//1920-1929
0x06566,0x0d4a0,0x0ea50,0x06e95,0x05ad0,0x02b60,0x186e3,0x092e0,0x1c8d7,0x0c950,//1930-1939
0x0d4a0,0x1d8a6,0x0b550,0x056a0,0x1a5b4,0x025d0,0x092d0,0x0d2b2,0x0a950,0x0b557,//1940-1949
0x06ca0,0x0b550,0x15355,0x04da0,0x0a5b0,0x14573,0x052b0,0x0a9a8,0x0e950,0x06aa0,//1950-1959
0x0aea6,0x0ab50,0x04b60,0x0aae4,0x0a570,0x05260,0x0f263,0x0d950,0x05b57,0x056a0,//1960-1969
0x096d0,0x04dd5,0x04ad0,0x0a4d0,0x0d4d4,0x0d250,0x0d558,0x0b540,0x0b6a0,0x195a6,//1970-1979
0x095b0,0x049b0,0x0a974,0x0a4b0,0x0b27a,0x06a50,0x06d40,0x0af46,0x0ab60,0x09570,//1980-1989
0x04af5,0x04970,0x064b0,0x074a3,0x0ea50,0x06b58,0x055c0,0x0ab60,0x096d5,0x092e0,//1990-1999
0x0c960,0x0d954,0x0d4a0,0x0da50,0x07552,0x056a0,0x0abb7,0x025d0,0x092d0,0x0cab5,//2000-2009
0x0a950,0x0b4a0,0x0baa4,0x0ad50,0x055d9,0x04ba0,0x0a5b0,0x15176,0x052b0,0x0a930,//2010-2019
0x07954,0x06aa0,0x0ad50,0x05b52,0x04b60,0x0a6e6,0x0a4e0,0x0d260,0x0ea65,0x0d530,//2020-2029
0x05aa0,0x076a3,0x096d0,0x04bd7,0x04ad0,0x0a4d0,0x1d0b6,0x0d250,0x0d520,0x0dd45,//2030-2039
0x0b5a0,0x056d0,0x055b2,0x049b0,0x0a577,0x0a4b0,0x0aa50,0x1b255,0x06d20,0x0ada0,//2040-2049
/**Add By JJonline@JJonline.Cn**/
0x14b63,0x09370,0x049f8,0x04970,0x064b0,0x168a6,0x0ea50, 0x06b20,0x1a6c4,0x0aae0,//2050-2059
0x0a2e0,0x0d2e3,0x0c960,0x0d557,0x0d4a0,0x0da50,0x05d55,0x056a0,0x0a6d0,0x055d4,//2060-2069
0x052d0,0x0a9b8,0x0a950,0x0b4a0,0x0b6a6,0x0ad50,0x055a0,0x0aba4,0x0a5b0,0x052b0,//2070-2079
0x0b273,0x06930,0x07337,0x06aa0,0x0ad50,0x14b55,0x04b60,0x0a570,0x054e4,0x0d160,//2080-2089
0x0e968,0x0d520,0x0daa0,0x16aa6,0x056d0,0x04ae0,0x0a9d4,0x0a2d0,0x0d150,0x0f252,//2090-2099
0x0d520);
public function __construct($curData=null){
if(!empty($curData)){
$this->curData=$curData;
}else{
$this->curData=date('Y-n-j');
}
$this->init();
}
public function init(){
$basedate='1900-2-1';//参照日期
$timezone='PRC';
$datetime= new DateTime($basedate, new DateTimeZone($timezone));
$curTime=new DateTime($this->curData, new DateTimeZone($timezone));
$offset = ($curTime->format('U') - $datetime->format('U'))/86400; //相差的天数
$offset=ceil($offset);
$this->difDay=$offset;
$offset+=1;//只能使用ceil,不能使用intval或者是floor,因为1900-1-31为正月初一,故需要加1
for($i=1900; $i<2050 && $offset>0; $i++){
$temp = $this->getYearDays($i); //计算i年有多少天
$offset -= $temp ;
$this->difmonth+=12;
//判断该年否存在闰月
if($this->leapMonth($i)>0){
$this->difmonth+=1;
}
}
if($offset<0){
$offset += $temp;
$i--;
$this->difmonth-=12;
}
if($this->leapMonth($i)>0){
$this->difmonth-=1;
}
$this->ylDays=$offset;
//此时$offset代表是农历该年的第多少天
$this->ylYeal=$i;//农历哪一年
//计算月份,依次减去1~12月份的天数,直到offset小于下个月的天数
$curMonthDays=$this->monthDays($this->ylYeal,1);
//判断是否该年是否存在闰月以及闰月的天数
$this->leap=$this->leapMonth($this->ylYeal);
if($this->leap !=0){
$this->leapDays=$this->leapDays($this->ylYeal);
}
for($i=1;$i<13 && $curMonthDays<$offset;$curMonthDays=$this->monthDays($this->ylYeal,++$i)){
if($this->leap == $i){ //闰月
if($offset>$this->leapDays){
--$i;
$offset-=$this->leapDays;
$this->difmonth+=1;
}else{
break;
}
}else{
$offset-=$curMonthDays;
$this->difmonth+=1;
}
}
$this->ylMonth=$i;
$this->yldate=$offset;
}
/**
*计算农历y年有多少天
**/
public function getYearDays($y){
$sum = 348;//12*29=348,不考虑小月的情况下
for($i=0x8000; $i>=0x10; $i>>=1){
$sum += ($this->dataInfo[$y-1900] & $i)? 1: 0;
}
return($sum+$this->leapDays($y));
}
/**
*获取某一年闰月的天数
**/
public function leapDays($y){
if($this->leapMonth($y)){
return(($this->dataInfo[$y-1900] & 0x10000)? 30: 29);
} else {
return(0);
}
}
/**
*计算哪一月为闰月
*/
public function leapMonth($y){
return ($this->dataInfo[$y-1900] & 0xf);
}
/**
*计算农历y年m月有多少天
*/
public function monthDays($y,$m){
return (($this->dataInfo[$y-1900] & (0x10000>>$m))? 30: 29 );
}
public function getLyTime(){
$tmp=array('初','一','二','三','四','五','六','七','八','九','十','廿');
$dateStr='';
if($this->ylMonth>10){
$m2=intval($this->ylMonth -10); //十位
$dateStr='十'.$tmp[$m2].'月';
}elseif($this->ylMonth==1){
$dateStr='正月';
}else{
$dateStr=$tmp[$this->ylMonth].'月';
}
if($this->yldate <11){
$dateStr.='初'.$tmp[$this->yldate];
}else{
$m1=intval($this->yldate / 10);
if( $m1 !=3){
$dateStr.=($m1==1)?'十':'廿';
$m2=$this->yldate % 10;
if($m2==0){
$dateStr.='十';
}else{
$dateStr.=$tmp[$m2];
}
}else{
$dateStr.='三十';
}
}
return $dateStr;
}
/**
*获取该年对于的天干地支年
**/
public function getYGanZhi(){
$gan=$this->tianGan[($this->ylYeal-4) % 10];
$zhi=$this->diZhi[($this->ylYeal-4) % 12];
return $gan.$zhi.'年';
}
/**
*获取该年对于的天干地支月
**/
public function getMGanZhi(){
$gan=$this->tianGan[($this->difmonth+3) % 10];
$zhi=$this->diZhi[($this->difmonth+1) % 12];
return $gan.$zhi.'月';
}
/**
*获取该年对于的天干地支日
**/
public function getDGanZhi(){
$gan=$this->tianGan[$this->difDay % 10];
$zhi=$this->diZhi[($this->difDay+4) % 12];
return $gan.$zhi.'日';
}
}
Kesan operasi adalah seperti berikut:
- Cadangan kursus
- Muat turun perisian kursus
-
PertengahanPertempuran sebenar Vue3 bahagian hadapan [projek vue tulisan tangan]
2857 orang sedang menonton -
peringkat rendahTutorial APIPOST [Popularisasi konsep teknikal yang berkaitan dengan komunikasi rangkaian]
1795 orang sedang menonton -
PertengahanIsu 22_Pertempuran sebenar yang komprehensif
5521 orang sedang menonton -
peringkat rendahIsu 22_PHP Pengaturcaraan
5172 orang sedang menonton -
peringkat rendahIsu 22_Pembangunan bahagian hadapan
8713 orang sedang menonton -
PertengahanTutorial Video Big Data (MySQL) Versi Penuh
4525 orang sedang menonton -
peringkat rendahPergi tutorial bahasa-penuh dengan maklumat praktikal dan tidak mengarut
2794 orang sedang menonton -
peringkat rendahKursus Pengaturcaraan Teras Bahasa GO
2814 orang sedang menonton -
PertengahanJS lanjutan dan pembelajaran BootStrap
2563 orang sedang menonton -
PertengahanPengoptimuman dan penyelesaian masalah SQL (versi MySQL)
3374 orang sedang menonton -
PertengahanTutorial temu bual pangkalan data Redis+MySQL
2963 orang sedang menonton -
peringkat rendahHantar makanan atau belajar pengaturcaraan?
5708 orang sedang menonton
Perisian kursus tidak tersedia untuk dimuat turun pada masa ini. Kakitangan sedang menganjurkannya. Sila beri perhatian lebih kepada kursus ini pada masa hadapan~
Pelajar yang telah menonton kursus ini juga sedang belajar
- Mari kita bercakap secara ringkas tentang memulakan perniagaan dalam PHP
- Pengenalan pantas kepada pembangunan bahagian hadapan web
- Pembangunan Tianlongbabu praktikal skala besar bagi rangka kerja MVC versi Mini meniru laman web ensiklopedia perkara yang memalukan
- Bermula dengan Pembangunan Praktikal PHP: Penciptaan PHP Pantas [Forum Perniagaan Kecil]
- Pengesahan log masuk dan papan mesej klasik
- Pengumpulan pengetahuan rangkaian komputer
- Mula Pantas Node.JS Versi Penuh
- Kursus bahagian hadapan yang paling memahami anda: HTML5/CSS3/ES6/NPM/Vue/...[Asal]
- Tulis rangka kerja PHP MVC anda sendiri (40 bab secara mendalam/butiran besar/mesti dibaca untuk pemula untuk maju)
- Tentang kita Penafian Sitemap
- Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!