丹棱网站建设,网站加载进度条,网址缩短在线生成app,博客网站开发报告文库农历#xff08;Lunar calendar#xff09;和公历#xff08;Gregorian calendar#xff09;是两种不同的日历系统。公历是基于太阳和地球的运动来计算时间的#xff0c;而农历是基于月亮的运动来计算时间的。农历中的月份是根据月亮的相对位置来确定的#xff0c;而公历…农历Lunar calendar和公历Gregorian calendar是两种不同的日历系统。公历是基于太阳和地球的运动来计算时间的而农历是基于月亮的运动来计算时间的。农历中的月份是根据月亮的相对位置来确定的而公历中的月份是固定的。因此农历和公历中的月份长度是不同的。同时农历中还有闰月的概念这是公历中没有的。转换农历日期到公历日期的过程需要计算农历中的每个月的长度以及闰月的存在情况。这些信息可以通过农历算法来计算得到。反之转换公历日期到农历日期也是同样的原理。简单来说农历公历日期转换原理就是利用农历算法通过计算月亮的相对位置和地球和太阳的运动来确定农历日期和公历日期之间的对应关系。凡是涉及日历、日程的程序或多或少会用到这一功能本文用php实现农历公历日期的相互转换。首先定义两个函数分别为solarToLunar和lunarToSolar。solarToLunar用于将公历转换为农历。/*** 将公历日期转换为农历日期* param int $year 公历年份* param int $month 公历月份* param int $day 公历日期* return array* array[0] : 农历年份* array[1] : 农历月份* array[2] : 农历日期*/
function solarToLunar($solarYear, $solarMonth, $solarDay) {$lunar_date array();$y $solarYear;$m $solarMonth;$d $solarDay;$x 0;$dx 0;$l 0;$dl 0;$y ($m 1 || $m 2) ? $y - 1 : $y;$x floor(($y - 1) / 4);$dx ($y - 1) % 4;$l floor(($y - 1) / 12);$dl ($y - 1) % 12;$sum floor(365.25 * $y) - floor(7 * $x 2375006.5) floor(30.6 * ($m 1)) $d - 1;$sum - floor(3 * $l 1867216.25 / 12) - floor(($dl 7) / 12) - floor(($dl 11) * 30.6);$lunar_year floor(($sum 7) / 291669 * 12 101);$lunar_month floor($sum / 291669 * 12 1) - $lunar_year * 12;$lunar_day $sum - floor(291669 * ($lunar_month - 1) / 12) 1;$lunar_date array(year $lunar_year, month $lunar_month, day $lunar_day);return $lunar_date;
}lunarToSolar用于将农历转换为公历。/*** 将农历日期转换为公历日期* param int $year 农历年份* param int $month 农历月份闰月为负数* param int $day 农历日期* return array* array[0] : 公历年份* array[1] : 公历月份* array[2] : 公历日期*/
function lunarToSolar($year, $month, $day)
{$leap_month getLeapMonth($year);// 判断是否为闰月if ($month 0) {$month abs($month);$is_leap_month true;} else {$is_leap_month false;}$lunar_days getLunarMonthDays($year, $month);// 计算农历距离公历元年的天数$lunar_offset getLunarYearDays($year) getLunarMonthDays($year, $month) $day - 1;// 公历元年为1900年每年的天数为365天或366天$solar_year 1900;$solar_days 365;while ($lunar_offset $solar_days) {$solar_year;$solar_days isLeapYear($solar_year) ? 366 : 365;$lunar_offset - $solar_days;}// 根据天数计算公历月份和日期$solar_month 1;while ($lunar_offset getSolarMonthDays($solar_year, $solar_month)) {$lunar_offset - getSolarMonthDays($solar_year, $solar_month);$solar_month;}$solar_day $lunar_offset 1;return array($solar_year, $solar_month, $solar_day);
}下面的代码用于辅助实现日期转换。定义天干、地支、生肖等数组。$gan array(甲, 乙, 丙, 丁, 戊, 己, 庚, 辛, 壬, 癸);
$zhi array(子, 丑, 寅, 卯, 辰, 巳, 午, 未, 申, 酉, 戌, 亥);
$shengxiao array(鼠, 牛, 虎, 兔, 龙, 蛇, 马, 羊, 猴, 鸡, 狗, 猪);利用公式计算天干地支$ganIndex ($lunar_date[year] - 3) % 10;
$zhiIndex ($lunar_date[year] - 3) % 12;计算生肖$shengxiaoIndex ($lunar_date[year] - 4) % 12;将天干、地支、生肖拼接成字符串$ganzhi $gan[$ganIndex] . $zhi[$zhiIndex];
$shengxiao $shengxiao[$shengxiaoIndex];以上就是实现天干地支和生肖转换的代码。