PHP实现24节气的计算方法

二十四节气的日期规定:

  太阳从黄经零度起,沿黄经每运行15度所经历的时日称为“一个节气”。每年运行360度,共经历24个节气,每月2个。其中,每月第一个节气为“节气”,即:立春、惊蛰、清明、立夏、芒种、小暑、立秋、白露、寒露、立冬、大雪和小寒等12个节气;每月的第二个节气为“中气”,即:雨水、春分、谷雨、小满、夏至、大暑、处暑、秋分、霜降、小雪、冬至和大寒等12个节气。“节气” 和“中气”交替出现,各历时15天,现在人们已经把“节气”和“中气”统称为“节气”。

二十四节气计算公式:

 立春日期的计算

  计算公式:[Y*D+C]-L

  公式解读:年数的后2位乘0.2422加3.87取整数减闰年数。21世纪C值=3.87,22世纪C值=4.15。

  举例说明:2058年立春日期的计算步骤[58×.0.2422+3.87]-[(58-1)/4]=17-14=3,则2月3日立春。

  雨水日期的计算 [Y*D+C]-L

  公式解读:年数的后2位乘0.2422加18.74取整数减闰年数。21世纪雨水的C值18.73。

  举例说明:2008年雨水日期=[8×.0.2422+18.73]-[(8-1)/4]=20-1=19,2月19日雨水。

  例外:2026年计算得出的雨水日期应调减一天为18日。

  惊蛰日期的计算 [Y*D+C]-L

  公式解读:年数的后2位乘0.2422加5.63取整数减闰年数。21世纪惊蛰的C值=5.63。

  举例说明:2088年惊蛰日期=[88×.0.2422+5.63]-[88/4]=26-22=4,3月4日是惊蛰。

  例外:无。

  春分日期的计算 [Y*D+C]-L

  公式解读:年数的后2位乘0.2422加20.646取整数减闰年数。21世纪春分的C值=20.646。

  举例说明:2092年春分日期=[92×.0.2422+20.646]-[92/4]=42-23=19,3月19日是春分。

  例外:2084年的计算结果加1日。

  清明节日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=4.81,20世纪=5.59。

  举例说明:2088年清明日期=[88×.0.2422+4.81]-[88/4]=26-22=4,4月4日是清明。

  例外:无。

  谷雨节日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=20.1,20世纪=20.888。

  举例说明:2088年谷雨日期=[88×.0.2422+20.1]-[88/4]=41-22=19,4月19日是谷雨。

  例外:无。

  立夏日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=5.52,20世纪=6.318。

  举例说明:2088年立夏日期=[88×.0.2422+5.52]-[88/4]=26-22=4,5月4日是立夏。

  例外:1911年的计算结果加1日。

  小满日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=21.04,20世纪=21.86。

  举例说明:2088年小满日期=[88×.0.2422+21.04]-[88/4]=42-22=20,5月20日小满。

  例外:2008年的计算结果加1日。

  芒种日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=5.678,20世纪=6.5。

  举例说明:2088年芒种日期=[88×.0.2422+5.678]-[88/4]=26-22=4,6月4日芒种。

  例外:1902年的计算结果加1日。

  夏至日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=21.37,20世纪=22.20。

  举例说明:2088年夏至日期=[88×.0.2422+21.37]-[88/4]=42-22=20,6月20日夏至。

  例外:1928年的计算结果加1日。

  小暑日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=7.108,20世纪=7.928。

  举例说明:2088年小暑日期= [88×0.2422+7.108]-[88/4]=28-22=6,7月6日是小暑。

  例外:1925年和2016年的计算结果加1日。

  大暑日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=22.83,20世纪=23.65。

  举例说明:2088年大暑日期= [88×0.2422+22.83]-[88/4]=44-22=22,7月22日大暑。

  例外:1922年的计算结果加1日。

  立秋日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=7.5,20世纪=8.35。

  举例说明:2088年立秋日期=[88×0.2422+7.5]-[88/4]=28-22=6,8月6日是立秋。

  例外:2002年的计算结果加1日。

  处暑日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=23.13,20世纪=23.95。

  举例说明:2088年处暑日期=[88×0.2422+23.13]-[88/4]=44-22=22,8月22日处暑。

  例外:无。

  白露日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=7.646,20世纪=8.44。

  举例说明:2088年白露日期=[88×0.2422+7.646]-[88/4]=28-22=6,9月6日是白露。

  例外:1927年的计算结果加1日。

  秋分日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=23.042,20世纪=23.822。

  举例说明:2088年秋分日期=[8×.0.2422+23.042]-[88/4]=44-22=22,9月22日是秋分。

  例外:1942年的计算结果加1日。

  寒露日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=8.318,20世纪=9.098。

  举例说明:2088年寒露日期=[88×0.2422+8.318]-[88/4]=29-22=7,10月7日是寒露。

  例外:无。

  霜降日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=23.438,20世纪=24.218。

  举例说明:2088年霜降日期=[88×0.2422+23.438]-[88/4]=44-22=22,10月22日霜降。

  例外:2089年的计算结果加1日。

  立冬日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=7.438,20世纪=8.218。

  举例说明:2088年立冬日期=[88×0.2422+7.438]-[88/4]=28-22=6,11月6日是立冬。

  例外:2089年的计算结果加1日。

  小雪日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=22.36,20世纪=23.08。

  举例说明:2088年小雪日期=[88×0.2422+22.36]-[88/4]=43-22=21,11月21日小雪。

  例外:1978年的计算结果加1日。

  大雪日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=7.18,20世纪=7.9。

  举例说明:2088年大雪日期=[88×0.2422+7.18]-[88/4]=28-22=6,12月6日大雪。

  例外:1954年的计算结果加1日。

  冬至日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=21.94,20世纪=22.60。

  举例说明:2088年冬至日期=[88×0.2422+21.94]-[88/4]=43-22=21,12月21日冬至。

  例外:1918年和2021年的计算结果减1日。

  小寒日期的计算 [Y*D+C]-L

  公式解读:Y=年数后2位,D=0.2422,L=闰年数,21世纪C=5.4055,20世纪=6.11。

  举例说明:1988年小寒日期=[88×.0.2422+6.11]-[(88-1)/4]=27-21=6,1月6日小寒。

  例外:1982年计算结果加1日,2019年减1日。

  大寒日期的计算 [Y*D+C]-L

  公式解读:Y=年数的后2位,D=0.2422,L=闰年数,21世纪C=20.12,20世纪C=20.84。

  举例说明:2089年大寒日期=[89×0.2422+20.12]-[(89-1)/4]=41-22=19,1月19日大寒。

  例外:2082年的计算结果加1日,20世纪无。

这些解说都来自于   二十四节气计算公式 [Y×D+C]-L中的C是怎么规定的

public function get_solar(){
    	header("Content-Type:text/html;charset=utf-8");  
    	$year=date('Y');//获取年份Y表示四位年份2020   y表示两位年份20年
		$month=date('m');//获取月份
		$day=date('d');//获取当前日期
        //获取当前年份的后两位,若使用Y需要使用下面的substr来截取日期。
        $years = substr($year,-2)+0;   
        //根据条件来筛选 数组第二位表示特殊年份 第三位表示特殊年份需要加1还是减1
        $parameter= array(   
            array(5.4055,2019,-1),//小寒   
            array(20.12,2082,1),//大寒   
            array(3.87),//立春   
            array(18.74,2026,-1),//雨水   
            array(5.63),//惊蛰   
            array(20.646,2084,1),//春分   
            array(4.81),//清明   
            array(20.1),//谷雨   
            array(5.52,1911,1),//立夏   
            array(21.04,2008,1),//小满   
            array(5.678,1902,1),//芒种   
            array(21.37,1928,1),//夏至   
            array(7.108,2016,1),//小暑   
            array(22.83,1922,1),//大暑   
            array(7.5,2002,1),//立秋   
            array(23.13),//处暑   
            array(7.646,1927,1),//白露   
            array(23.042,1942,1),//秋分   
            array(8.318),//寒露   
            array(23.438,2089,1),//霜降   
            array(7.438,2089,1),//立冬   
            array(22.36,1978,1),//小雪   
            array(7.18,1954,1),//大雪   
            array(21.94,2021,-1)//冬至   
        );   
        $term_name = array(      
        "小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨",      
        "立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑",      
        "白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至");   
           
        $index= ($month-1)*2;//获取数组中的键 
        $_leap_value = floor(($years-1)/4);   
        $day1 = floor($years*0.2422+$parameter[$index][0])-$_leap_value;//获取这个月的第一个节气日期
        if(isset($parameter[$index][1])&&$parameter[$index][1]==$year) 
            $day1 += $parameter[$index][2];//判断该节气是否有特殊日期,有的话需要对其+-1天   
        $day2 = floor($years*0.2422+$parameter[$index+1][0])-$_leap_value;//获取这个月的第二个节气日期   
        if(isset($parameter[$index+1][1])&&$parameter[$index+1][1]==$year) 
            $day2 += $parameter[$index+1][2];//判断该节气是否有特殊日期,有的话需要对其+-1天 
        $data=array();

        //根据条件进行判断用day2和day1与day比较前提是day2一定大于day1的
        if($day<$day1){
            $data['name1']=$term_name[$index-1];
            $data['flag']=1;
            $data['name2']=$term_name[$index];
        }else if($day==$day1){
            $data['name1']=$term_name[$index];
            $data['flag']=2;
            $data['name2']=$term_name[$index];
        }else if($day>$day1 && $day<$day2){
            $data['name1']=$term_name[$index];
            $data['flag']=1;
            $data['name2']=$term_name[$index+1];
        }else if($day==$day2){
            $data['name1']=$term_name[$index+1];
            $data['flag']=2;
            $data['name2']=$term_name[$index+1];
        }else if($day>$day2){
            $data['name1']=$term_name[$index+1];
            $data['flag']=1;
            $data['name2']=$term_name[$index+2];
        }
        return $data;
    }

//若name2=name1,那么今天就是一个节气,当name2<>name1 那么name2表示下一个节气,name1表示上一个节气

 

借鉴原文的是  php 根据时间获取二十四节气,返回json  ---这个文章中有出错的地方,所以我更改了,做了借鉴,感谢他们写的文章给我借鉴

 

 

还有一篇文章,具有借鉴意义   PHP判断节假日、农历、节气

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值