php实现农历公历日期的相互转换
农历(Lunar calendar)和公历(Gregorian calendar)是两种不同的日历系统。公历是基于太阳和地球的运动来计算时间的,而农历是基于月亮的运动来计算时间的。
农历中的月份是根据月亮的相对位置来确定的,而公历中的月份是固定的。因此,农历和公历中的月份长度是不同的。同时,农历中还有闰月的概念,这是公历中没有的。
转换农历日期到公历日期的过程需要计算农历中的每个月的长度,以及闰月的存在情况。这些信息可以通过农历算法来计算得到。反之,转换公历日期到农历日期也是同样的原理。
简单来说,农历公历日期转换原理就是利用农历算法通过计算月亮的相对位置和地球和太阳的运动来确定农历日期和公历日期之间的对应关系。
凡是涉及日历、日程的程序,或多或少会用到这一功能,本文用php实现农历公历日期的相互转换。
首先定义两个函数,分别为solarToLunar和lunarToSolar。
solarToLunar用于将公历转换为农历。
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用于将农历转换为公历。
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];
以上就是实现天干地支和生肖转换的代码。
来源地址:https://blog.csdn.net/u010986241/article/details/128978195
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341