最近对阳历转阴历从而得到相应节日的算法这方面比较感兴趣,于是就在网上搜了一圈。不错,还算是找到一个比较不错的php类,实现了将阳历转换为阴历(农历),阴历转换为阳历的算法,同时还能获取干支纪年,生肖,以及相应的阴历的中文叫法等等,功能还是挺齐全的,在这里分享给大家。

具体类代码如下:

class Lunar {var $MIN_YEAR = 1891;var $MAX_YEAR = 2100;var $lunarInfo = array(array(0, 2, 9, 21936), array(6, 1, 30, 9656), array(0, 2, 17, 9584), array(0, 2, 6, 21168), array(5, 1, 26, 43344), array(0, 2, 13, 59728),array(0, 2, 2, 27296), array(3, 1, 22, 44368), array(0, 2, 10, 43856), array(8, 1, 30, 19304), array(0, 2, 19, 19168), array(0, 2, 8, 42352),array(5, 1, 29, 21096), array(0, 2, 16, 53856), array(0, 2, 4, 55632), array(4, 1, 25, 27304), array(0, 2, 13, 22176), array(0, 2, 2, 39632),array(2, 1, 22, 19176), array(0, 2, 10, 19168), array(6, 1, 30, 42200), array(0, 2, 18, 42192), array(0, 2, 6, 53840), array(5, 1, 26, 54568),array(0, 2, 14, 46400), array(0, 2, 3, 54944), array(2, 1, 23, 38608), array(0, 2, 11, 38320), array(7, 2, 1, 18872), array(0, 2, 20, 18800),array(0, 2, 8, 42160), array(5, 1, 28, 45656), array(0, 2, 16, 27216), array(0, 2, 5, 27968), array(4, 1, 24, 44456), array(0, 2, 13, 11104),array(0, 2, 2, 38256), array(2, 1, 23, 18808), array(0, 2, 10, 18800), array(6, 1, 30, 25776), array(0, 2, 17, 54432), array(0, 2, 6, 59984),array(5, 1, 26, 27976), array(0, 2, 14, 23248), array(0, 2, 4, 11104), array(3, 1, 24, 37744), array(0, 2, 11, 37600), array(7, 1, 31, 51560),array(0, 2, 19, 51536), array(0, 2, 8, 54432), array(6, 1, 27, 55888), array(0, 2, 15, 46416), array(0, 2, 5, 22176), array(4, 1, 25, 43736),array(0, 2, 13, 9680), array(0, 2, 2, 37584), array(2, 1, 22, 51544), array(0, 2, 10, 43344), array(7, 1, 29, 46248), array(0, 2, 17, 27808),array(0, 2, 6, 46416), array(5, 1, 27, 21928), array(0, 2, 14, 19872), array(0, 2, 3, 42416), array(3, 1, 24, 21176), array(0, 2, 12, 21168),array(8, 1, 31, 43344), array(0, 2, 18, 59728), array(0, 2, 8, 27296), array(6, 1, 28, 44368), array(0, 2, 15, 43856), array(0, 2, 5, 19296),array(4, 1, 25, 42352), array(0, 2, 13, 42352), array(0, 2, 2, 21088), array(3, 1, 21, 59696), array(0, 2, 9, 55632), array(7, 1, 30, 23208),array(0, 2, 17, 22176), array(0, 2, 6, 38608), array(5, 1, 27, 19176), array(0, 2, 15, 19152), array(0, 2, 3, 42192), array(4, 1, 23, 53864),array(0, 2, 11, 53840), array(8, 1, 31, 54568), array(0, 2, 18, 46400), array(0, 2, 7, 46752), array(6, 1, 28, 38608), array(0, 2, 16, 38320),array(0, 2, 5, 18864), array(4, 1, 25, 42168), array(0, 2, 13, 42160), array(10, 2, 2, 45656), array(0, 2, 20, 27216), array(0, 2, 9, 27968),array(6, 1, 29, 44448), array(0, 2, 17, 43872), array(0, 2, 6, 38256), array(5, 1, 27, 18808), array(0, 2, 15, 18800), array(0, 2, 4, 25776),array(3, 1, 23, 27216), array(0, 2, 10, 59984), array(8, 1, 31, 27432), array(0, 2, 19, 23232), array(0, 2, 7, 43872), array(5, 1, 28, 37736),array(0, 2, 16, 37600), array(0, 2, 5, 51552), array(4, 1, 24, 54440), array(0, 2, 12, 54432), array(0, 2, 1, 55888), array(2, 1, 22, 23208),array(0, 2, 9, 22176), array(7, 1, 29, 43736), array(0, 2, 18, 9680), array(0, 2, 7, 37584), array(5, 1, 26, 51544), array(0, 2, 14, 43344),array(0, 2, 3, 46240), array(4, 1, 23, 46416), array(0, 2, 10, 44368), array(9, 1, 31, 21928), array(0, 2, 19, 19360), array(0, 2, 8, 42416),array(6, 1, 28, 21176), array(0, 2, 16, 21168), array(0, 2, 5, 43312), array(4, 1, 25, 29864), array(0, 2, 12, 27296), array(0, 2, 1, 44368),array(2, 1, 22, 19880), array(0, 2, 10, 19296), array(6, 1, 29, 42352), array(0, 2, 17, 42208), array(0, 2, 6, 53856), array(5, 1, 26, 59696),array(0, 2, 13, 54576), array(0, 2, 3, 23200), array(3, 1, 23, 27472), array(0, 2, 11, 38608), array(11, 1, 31, 19176), array(0, 2, 19, 19152),array(0, 2, 8, 42192), array(6, 1, 28, 53848), array(0, 2, 15, 53840), array(0, 2, 4, 54560), array(5, 1, 24, 55968), array(0, 2, 12, 46496),array(0, 2, 1, 22224), array(2, 1, 22, 19160), array(0, 2, 10, 18864), array(7, 1, 30, 42168), array(0, 2, 17, 42160), array(0, 2, 6, 43600),array(5, 1, 26, 46376), array(0, 2, 14, 27936), array(0, 2, 2, 44448), array(3, 1, 23, 21936), array(0, 2, 11, 37744), array(8, 2, 1, 18808),array(0, 2, 19, 18800), array(0, 2, 8, 25776), array(6, 1, 28, 27216), array(0, 2, 15, 59984), array(0, 2, 4, 27424), array(4, 1, 24, 43872),array(0, 2, 12, 43744), array(0, 2, 2, 37600), array(3, 1, 21, 51568), array(0, 2, 9, 51552), array(7, 1, 29, 54440), array(0, 2, 17, 54432),array(0, 2, 5, 55888), array(5, 1, 26, 23208), array(0, 2, 14, 22176), array(0, 2, 3, 42704), array(4, 1, 23, 21224), array(0, 2, 11, 21200),array(8, 1, 31, 43352), array(0, 2, 19, 43344), array(0, 2, 7, 46240), array(6, 1, 27, 46416), array(0, 2, 15, 44368), array(0, 2, 5, 21920),array(4, 1, 24, 42448), array(0, 2, 12, 42416), array(0, 2, 2, 21168), array(3, 1, 22, 43320), array(0, 2, 9, 26928), array(7, 1, 29, 29336),array(0, 2, 17, 27296), array(0, 2, 6, 44368), array(5, 1, 26, 19880), array(0, 2, 14, 19296), array(0, 2, 3, 42352), array(4, 1, 24, 21104),array(0, 2, 10, 53856), array(8, 1, 30, 59696), array(0, 2, 18, 54560), array(0, 2, 7, 55968), array(6, 1, 27, 27472), array(0, 2, 15, 22224),array(0, 2, 5, 19168), array(4, 1, 25, 42216), array(0, 2, 12, 42192), array(0, 2, 1, 53584), array(2, 1, 21, 55592), array(0, 2, 9, 54560),);/*** 将阳历转换为阴历* @param year 公历-年* @param month 公历-月* @param date 公历-日*/
function convertSolarToLunar($year, $month, $date) {//debugger;$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {return array(1891, '正月', '初一', '辛卯', 1, 1, '兔');}return $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $date, $yearData[1], $yearData[2]));
}function convertSolarMonthToLunar($year, $month) {$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {return array(1891, '正月', '初一', '辛卯', 1, 1, '兔');}$month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);$dd = $month_days_ary[$month];if ($this->isLeapYear($year) && $month == 2) {$dd++;}$lunar_ary = array();for ($i = 1; $i < $dd; $i++) {$array = $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $i, $yearData[1], $yearData[2]));$array[] = $year . '-' . $month . '-' . $i;$lunar_ary[$i] = $array;}return $lunar_ary;
}/*** 将阴历转换为阳历* @param year 阴历-年* @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0* @param date 阴历-日*/
function convertLunarToSolar($year, $month, $date) {$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];$between = $this->getDaysBetweenLunar($year, $month, $date);$res = mktime(0, 0, 0, $yearData[1], $yearData[2], $year);$res = date('Y-m-d', $res + $between * 24 * 60 * 60);$day = explode('-', $res);$year = $day[0];$month = $day[1];$day = $day[2];return array($year, $month, $day);
}/*** 判断是否是闰年* @param year*/
function isLeapYear($year) {return (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0));
}/*** 获取干支纪年* @param year*/
function getLunarYearName($year) {$sky = array('庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己');$earth = array('申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未');$year = $year . '';return $sky[$year{3}] . $earth[$year % 12];
}/*** 根据阴历年获取生肖* @param year 阴历年*/
function getYearZodiac($year) {$zodiac = array('猴', '鸡', '狗', '猪', '鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊');return $zodiac[$year % 12];
}/*** 获取阳历月份的天数* @param year 阳历-年* @param month 阳历-月*/
function getSolarMonthDays($year, $month) {$monthHash = array('1' => 31, '2' => $this->isLeapYear($year) ? 29 : 28, '3' => 31, '4' => 30, '5' => 31, '6' => 30, '7' => 31, '8' => 31, '9' => 30, '10' => 31, '11' => 30, '12' => 31);return $monthHash["$month"];
}/*** 获取阴历月份的天数* @param year 阴历-年* @param month 阴历-月,从一月开始*/
function getLunarMonthDays($year, $month) {$monthData = $this->getLunarMonths($year);return $monthData[$month - 1];
}/*** 获取阴历每月的天数的数组* @param year*/
function getLunarMonths($year) {$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];$leapMonth = $yearData[0];$bit = decbin($yearData[3]);for ($i = 0; $i < strlen($bit); $i++) {$bitArray[$i] = substr($bit, $i, 1);}for ($k = 0, $klen = 16 - count($bitArray); $k < $klen; $k++) {array_unshift($bitArray, '0');}$bitArray = array_slice($bitArray, 0, ($leapMonth == 0 ? 12 : 13));for ($i = 0; $i < count($bitArray); $i++) {$bitArray[$i] = $bitArray[$i] + 29;}return $bitArray;
}/*** 获取农历每年的天数* @param year 农历年份*/
function getLunarYearDays($year) {$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];$monthArray = $this->getLunarYearMonths($year);$len = count($monthArray);return ($monthArray[$len - 1] == 0 ? $monthArray[$len - 2] : $monthArray[$len - 1]);
}function getLunarYearMonths($year) {//debugger;$monthData = $this->getLunarMonths($year);$res = array();$temp = 0;$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];$len = ($yearData[0] == 0 ? 12 : 13);for ($i = 0; $i < $len; $i++) {$temp = 0;for ($j = 0; $j <= $i; $j++) {$temp += $monthData[$j];}array_push($res, $temp);}return $res;
}/*** 获取闰月* @param year 阴历年份*/
function getLeapMonth($year) {$yearData = $this->lunarInfo[$year - $this->MIN_YEAR];return $yearData[0];
}/*** 计算阴历日期与正月初一相隔的天数* @param year* @param month* @param date*/
function getDaysBetweenLunar($year, $month, $date) {$yearMonth = $this->getLunarMonths($year);$res = 0;for ($i = 1; $i < $month; $i++) {$res += $yearMonth[$i - 1];}$res += $date - 1;return $res;
}/*** 计算2个阳历日期之间的天数* @param year 阳历年* @param cmonth* @param cdate* @param dmonth 阴历正月对应的阳历月份* @param ddate 阴历初一对应的阳历天数*/
function getDaysBetweenSolar($year, $cmonth, $cdate, $dmonth, $ddate) {$a = mktime(0, 0, 0, $cmonth, $cdate, $year);$b = mktime(0, 0, 0, $dmonth, $ddate, $year);return ceil(($a - $b) / 24 / 3600);
}/*** 根据距离正月初一的天数计算阴历日期* @param year 阳历年* @param between 天数*/
function getLunarByBetween($year, $between) {//debugger;$lunarArray = array();$yearMonth = array();$t = 0;$e = 0;$leapMonth = 0;$m = '';if ($between == 0) {array_push($lunarArray, $year, '正月', '初一');$t = 1;$e = 1;} else {$year = $between > 0 ? $year : ($year - 1);$yearMonth = $this->getLunarYearMonths($year);$leapMonth = $this->getLeapMonth($year);$between = $between > 0 ? $between : ($this->getLunarYearDays($year) + $between);for ($i = 0; $i < 13; $i++) {if ($between == $yearMonth[$i]) {$t = $i + 2;$e = 1;break;} else if ($between < $yearMonth[$i]) {$t = $i + 1;$e = $between - (empty($yearMonth[$i - 1]) ? 0 : $yearMonth[$i - 1]) + 1;break;}}$m = ($leapMonth != 0 && $t == $leapMonth + 1) ? ('闰' . $this->getCapitalNum($t - 1, true)) : $this->getCapitalNum(($leapMonth != 0 && $leapMonth + 1 < $t ? ($t - 1) : $t), true);array_push($lunarArray, $year, $m, $this->getCapitalNum($e, false));}array_push($lunarArray, $this->getLunarYearName($year)); // 天干地支array_push($lunarArray, $t, $e);array_push($lunarArray, $this->getYearZodiac($year)); // 12生肖array_push($lunarArray, $leapMonth); // 闰几月return $lunarArray;
}/*** 获取数字的阴历叫法* @param num 数字* @param isMonth 是否是月份的数字*/
function getCapitalNum($num, $isMonth) {$isMonth = $isMonth || false;$dateHash = array('0' => '', '1' => '一', '2' => '二', '3' => '三', '4' => '四', '5' => '五', '6' => '六', '7' => '七', '8' => '八', '9' => '九', '10' => '十 ');$monthHash = array('0' => '', '1' => '正月', '2' => '二月', '3' => '三月', '4' => '四月', '5' => '五月', '6' => '六月', '7' => '七月', '8' => '八月', '9' => '九月', '10' => '十月', '11' => '冬月', '12' => '腊月');$res = '';if ($isMonth) {$res = $monthHash[$num];} else {if ($num <= 10) {$res = '初' . $dateHash[$num];} else if ($num > 10 && $num < 20) {$res = '十' . $dateHash[$num - 10];} else if ($num == 20) {$res = "二十";} else if ($num > 20 && $num < 30) {$res = "廿" . $dateHash[$num - 20];} else if ($num == 30) {$res = "三十";}}return $res;
}

}
使用方法如下:

header("Content-Type:text/html;charset=utf-8");
$lunar = new Lunar();
$month = $lunar->convertSolarToLunar('2018', '09', '25'); //将阳历转换为阴历。注:这三个参数都必须是字符串类型,否则会报错
echo '<pre>';
print_r($month);

打打印结果如下:

Array
([0] => 2018[1] => 八月[2] => 十六[3] => 戊戌[4] => 8[5] => 16[6] => 狗[7] => 0
)

php实现阳历阴历互转的方法相关推荐

  1. mysql 阴阳历对照表_php实现阳历阴历互转的方法_PHP

    最近对阳历转阴历从而得到相应节日的算法这方面比较感兴趣,于是就在网上搜了一圈.不错,还算是找到一个比较不错的php类,实现了将阳历转换为阴历(农历),阴历转换为阳历的算法,同时还能获取干支纪年,生肖, ...

  2. JS农历公历互转 阳历阴历互转

    参考https://blog.jjonline.cn/userInterFace/173.html 测试: //农历转公var str = "1990-12-29";var res ...

  3. java集合转字符串拼接_关于集合和字符串的互转实现方法

    今天在写项目的时候遇到一个问题,就是要把得到的一个集合转换成字符串,发现 import org.apache.commons.lang.stringutils; 有这么一个简单的方法:string s ...

  4. Android中dp与px互转的方法

    在Android中dp和px互转的工具类,直接调用即可 public class ScaleUtils { //dp转pxpublic static int dip2px(Context contex ...

  5. 原神2.1 官服与B服互转的方法

    根据在B站收集到的线索,现整理出针对2.1版本的原神官服和B服互转的方法.此方法未经测试,不保证有效. 2.1版本在B服需要另外一个文件才可以运行,不然会报错.PCGameSDK.dll 此文件已上传 ...

  6. 【GlobalMapper精品教程】024:批量高效实现多种数据格式互转的方法

    globalmapper批量高效实现多种数据格式互转的方法. 文章目录 一.批量格式转换 二.格式转换形式举例 一.批量格式转换 选择原文件类型: 选择文件类型: 在源文件列表中添加需要转换的文件或者 ...

  7. java集合转字符串_关于集合和字符串的互转实现方法

    今天在写项目的时候遇到一个问题,就是要把得到的一个集合转换成字符串,发现 import org.apache.commons.lang.StringUtils; 有这么一个简单的方法:String s ...

  8. 虚拟机与主机互传文件方法分享

    虚拟机与主机互传文件方法分享 现在虚拟机的使用已经非常普及,无论新手学习,还是运维工程师搭建虚拟化平台,都会使用到虚拟机.对个人用户来说,非常方便就能搭建很多操作系统进行学习:对企业用户来说更是降低了 ...

  9. iPhone 共享 文件服务器,iPhone手机打开服务器功能,和Windows电脑互传文件方法

    iPhone手机打开服务器功能,和Windows电脑互传文件方法 PC端设置: 一.在计算机端新建一个文件夹,例如取名为:"iphone共享文件". 二.然后右键点击文件夹属,点击 ...

  10. 如何将图片和PDF互转?PDF Expert for Mac将图片和PDF互转的方法

    如何将图片和PDF互转?图片和PDF互转应该是我们经常会遇到的事情了,PDF Expert for Mac是功能很强大的PDF软件,下面介绍一下关于PDF Expert for Mac将图片和PDF互 ...

最新文章

  1. 8种Python字符串拼接的方法,你知道几种?
  2. MySQL / schema的概念
  3. Windows 服务(附服务开发辅助工具)
  4. Hybrid框架UI重构之路:五、前端那点事儿(HTML、CSS)
  5. 创建单IP的***网络
  6. latex 符号_sympy: 符号运算-1
  7. matlab创建nc文件怎么打开,MATLAB打开nc文件并读取nc文件数据
  8. 程序员硬核吃瓜宋慧乔宋仲基离婚、范冰冰李晨分手!
  9. clinit和init(转载)
  10. JavaScript 上传文件并展示
  11. 腾讯IM请求报错腾讯IM:70421参数类型有问题
  12. android nat64,dpvs学习笔记: 18 nat64 的实现
  13. ssm是java框架吗,大名鼎鼎的SSM是指哪几个开源Java框架?( )
  14. python爬取歌词生成词云图
  15. php邮件回复功能,用PHP回复邮件(Laravel Mailgun)
  16. java新手,写了个简单的计算器,求高手指点一二
  17. [修練營ASP.NET]淺談多層式架構 (Multi Tiers)
  18. 在天堂与地狱之间——清华浪子梦断中关村[推荐]
  19. eclipse写程序从hdfs上下载文件到本地报错:at org.apache.hadoop.util.Shell.runCommand
  20. Vivado综合设置之-keep_equivalent_registers

热门文章

  1. 用html制作一个网站的步骤,新手怎么做网页 新手如何制作一个网页
  2. rescale matlab,frft_matlab integrated algorithm about Frft, matla - CodeBus
  3. Oracle 如何生成随机数字、字符串、日期、验证码以及 UUID
  4. vs以管理员身份运行
  5. 校园招聘的简历写作与面试技巧
  6. laravel seeder 填充数据
  7. 安装QT时遇到:canot start “d:\qt\vcredist\vcredist_x64.exe/norestart/q“:process failed to start :请求的操作需要提升
  8. buuctf|ciscn_2019_en_2 1
  9. 双系统启动引导项配置
  10. KMP,LCA(XJT Love Strings,玲珑杯 Round#8 A lonlife 1079)