摘要:背景最近做到一个项目需要阴历与阳历的相互转换网上找了很多资料发现很多都是不准的但是给了我参考价值算法借用百度百科的阳历太阳历又称为阳历,是以地球绕太阳公转的运动周期为基础而制定的历法。
最近做到一个项目,需要阴历与阳历的相互转换,网上找了很多资料,发现很多都是不准的,但是给了我参考价值
借用百度百科的:
太阳历又称为阳历,是以地球绕太阳公转的运动周期为基础而制定的历法。太阳历的历年近似等于回归年,一年12个月,这个“月”,实际上与朔望月无关。阳历的月份、日期都与太阳在黄道上的位置较好地符合,根据阳历的日期,在一年中可以明显看出四季寒暖变化的情况;但在每个月份中,看不出月亮的朔、望、两弦。如今世界通行的公历就是一种阳历,平年365天,闰年366天,每四年一闰,每满百年少闰一次,到第四百年再闰,即每四百年中有97个闰年。公历的历年平均长度与回归年只有26秒之差,要累积3300年才差一日。
privatefunctionyearShengXiao($lunarYear){//TODO至于为什么这样弄,我也没搞清楚returnself::SHENG_XIAO[($lunarYear-self::MIN_YEAR+36)%12];//年的属相}年的干支算法网上搜到的做法是用公元年来计算,但是不对,然后我换成阴历年居然就跟百度的日历能对上了,这个我也没弄清楚,但是能算出来了,公式:年数先减三,除10余数是天干,基数改用12除,余数便是地支年(如果余数为0,则取最大序号)
privatefunctionyearGanZhi($lunarYear){//年数先减三,除10余数是天干,基数改用12除,余数便是地支年(如果余数为0,则取最大序号)$yJiShu=$lunarYear-3;$yTianGan=($yJiShu%10==0)10:$yJiShu%10;$yDiZhi=($yJiShu%12==0)10:$yJiShu%12;$yGanZhi=self::TIAN_GAN[$yTianGan-1].self::DI_ZHI[$yDiZhi-1];////由于是从0开始,这里再减一return$yGanZhi;}月的干支算法网上搜索了,没找到好的实现方式,麻烦知道的在这里说一下,
网上搜到的:
G=4C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d-3Z=8C+[C/4]+5y+[y/4]+[3*(M+1)/5]+d+7+i其中C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月按上一年的13月和14月来算。奇数月i=0,偶数月i=6。G除以10的余数是天干,Z除以12的余数是地支。