农历(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);
}

下面的代码用于辅助实现日期转换。

  1. 定义天干、地支、生肖等数组。

$gan = array("甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸");
$zhi = array("子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥");
$shengxiao = array("鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪");
  1. 利用公式计算天干地支:

$ganIndex = ($lunar_date["year"] - 3) % 10;
$zhiIndex = ($lunar_date["year"] - 3) % 12;
  1. 计算生肖:

$shengxiaoIndex = ($lunar_date["year"] - 4) % 12;
  1. 将天干、地支、生肖拼接成字符串:

$ganzhi = $gan[$ganIndex] . $zhi[$zhiIndex];
$shengxiao = $shengxiao[$shengxiaoIndex];

以上就是实现天干地支和生肖转换的代码。

php实现农历公历日期的相互转换相关推荐

  1. c语言万年历农历转公历,公历日期与农历日期的相互转换程序

    公历日期与农历日期的相互转换程序 //********************************** // 公历日期与农历日期的相互转换程序 // 公元1800年1月25日-2101年1月28日 ...

  2. js 公历日期转农历带节假日

    参照地址:https://www.jb51.net/article/60616.htm 首先获取公历节假日代码: var basejieri={'0101':'元旦','0214':'情人节','03 ...

  3. js 根据公历日期 算出农历_根据公历日期计算农历年生肖及公历转换农历的方法...

    本帖最后由 wshcw 于 2011-12-6 23:23 编辑 有部分E友都知道,农历格式"[$-130000]e-m-d"转换出来的结果有好大一部分有误,那有没有其它转换办法呢 ...

  4. java 获取阴历日期公历日期转农历日期或者阳历日期转阴历日期

    背景 项目中需要获取农历日期,展示在页面,不使用第三方工具类的情况下,直接使用原生的java api工具类开发 代码如下 package com.hidata.devops.paas;import j ...

  5. Python将农历日期转换为公历日期

    from lunardate import LunarDate# 获取农历日期输入 lunar_year = int(input("请输入农历年份:")) lunar_month ...

  6. 根据公历日期获取到农历日期信息(带星座)(C#)

    直接上码,都有注释说明 using System; using System.Collections.Generic; using System.Globalization; using System ...

  7. java 农历节日 转公历日期_公历农历互相转换的Java日历工具类

    /** * 工具类,实现公农历互转 */ public class LunarCalendar { /** * 支持转换的最小农历年份 */ public static final int MIN_Y ...

  8. js 万年历农历转阳历 方法_Python 农历公历算法转换

    背景 日常用python处理各种数据分析工作,最近需要对历年春节期间的数据做一些对比工作,本来只是用了一个简单的日期数组来进行,但后来发现一些数据在农历日期进行对比的时候,会有一些有趣的规律,进而产生 ...

  9. 农历php,PHP农历公历转换

    /* 云南省曲靖师范学院计算机科学与工程学院-杨海熙编写 2009-9-3 */ class Lunar { private $_SMDay = array(1 => 31, 28, 31, 3 ...

最新文章

  1. 【深度学习】如何更好的Fit一个深度神经网络框架下的模型
  2. linux 远程控制权限,总结一下linux远程控制方法
  3. Multisim、protel和proteus的区别
  4. JS-面向对象-This的指向---简单的函数调用 / 作为对象的方法调用时 / 作为构造函数调用时
  5. 新浪微博 API 使用入门
  6. wordpress 表格文字对齐_掌握Word对齐技巧,排版又快又美观
  7. 解决windows7系统netmeeting无法(安装)使用问题
  8. 微信小程序地图点聚合
  9. 线性代数之——矩阵乘法和逆矩阵
  10. seaborn中sns.distplot图例显示方法及无法显示的解决办法
  11. 看了《我的白大褂》才明白,原来平安是福
  12. “泰迪杯”挑战赛 - 通过Java实现中央空调系统的数据分析与控制策略
  13. 如何快速办理软件著作权?
  14. Web地图服务规范(WMS、WMTS、TMS)简析
  15. Win32API UNICODE编码宽字节
  16. SIMD——MMX指令集介绍
  17. 《袁老师访谈录》第九期丨陈家强教授/香港科大商学院前院长【问诊未来·院长系列:科技铺就金融创新之路】...
  18. Lombok插件之简介、IDEA集成、注解使用
  19. 入门级Node.js express服务端开发_Android签到APP
  20. 穆迪分析在Chartis信用风险报告中被评为类别领导者

热门文章

  1. Qt编写数据可视化大屏界面电子看板1-布局方案
  2. 制造企业使用云平台可以做什么
  3. DEMO:ALV显示明细
  4. 通过XML转换下载.xlsx格式的excel文件
  5. 基金定投收益计算公式和复利计算公式
  6. SOCKET_RAW 手动封装TCP协议
  7. 关于word和excel实现套打快递单的问题
  8. SKU解密,修改SKU的影响,修改SKU流量下滑原因
  9. Spring的constructor-arg 与property注入
  10. Unity2019刷地形教程