废话不多,直接上代码

  1. <?php
  2. class Lunar
  3. {
  4. /**
  5. * Created by 闻海南.
  6. * User: timeless
  7. * Date: 2018-5-29
  8. * Time: 上午9:32s
  9. */
  10. var $MIN_YEAR = 1891;
  11. var $MAX_YEAR = 2100;
  12. var $lunarInfo = array(
  13. 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),
  14. 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),
  15. 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),
  16. 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),
  17. 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),
  18. 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),
  19. 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),
  20. 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),
  21. 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),
  22. 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),
  23. 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),
  24. 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),
  25. 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),
  26. 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),
  27. 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),
  28. 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),
  29. 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),
  30. 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),
  31. 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),
  32. 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),
  33. 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),
  34. 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),
  35. 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),
  36. 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),
  37. 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),
  38. 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),
  39. 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),
  40. 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),
  41. 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),
  42. 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),
  43. 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),
  44. 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),
  45. 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),
  46. 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),
  47. 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)
  48. );
  49.  
  50. /**
  51. * 将阳历转换为阴历
  52. * @param year 公历-年
  53. * @param month 公历-月
  54. * @param date 公历-日
  55. */
  56. function convertSolarToLunar($year, $month, $date)
  57. {//debugger;
  58. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  59. if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {
  60. return array(1891, '正月', '初一', '辛卯', 1, 1, '兔');
  61. }
  62. return $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $date, $yearData[1], $yearData[2]));
  63. }
  64.  
  65. function convertSolarMonthToLunar($year, $month)
  66. {
  67. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  68. if ($year == $this->MIN_YEAR && $month <= 2 && $date <= 9) {
  69. return array(1891, '正月', '初一', '辛卯', 1, 1, '兔');
  70. }
  71. $month_days_ary = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  72. $dd = $month_days_ary[$month];
  73. if ($this->isLeapYear($year) && $month == 2) $dd++;
  74. $lunar_ary = array();
  75. for ($i = 1; $i < $dd; $i++) {
  76. $array = $this->getLunarByBetween($year, $this->getDaysBetweenSolar($year, $month, $i, $yearData[1], $yearData[2]));
  77. $array[] = $year . '-' . $month . '-' . $i;
  78. $lunar_ary[$i] = $array;
  79. }
  80. return $lunar_ary;
  81. }
  82.  
  83. /**
  84. * 将阴历转换为阳历
  85. * @param year 阴历-年
  86. * @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0
  87. * @param date 阴历-日
  88. */
  89. function convertLunarToSolar($year, $month, $date)
  90. {
  91. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  92. $between = $this->getDaysBetweenLunar($year, $month, $date);
  93. $res = mktime(0, 0, 0, $yearData[1], $yearData[2], $year);
  94. $res = date('Y-m-d', $res + $between * 24 * 60 * 60);
  95. $day = explode('-', $res);
  96. $year = $day[0];
  97. $month = $day[1];
  98. $day = $day[2];
  99. return array($year, $month, $day);
  100. }
  101.  
  102. /**
  103. * 判断是否是闰年
  104. * @param year
  105. */
  106. function isLeapYear($year)
  107. {
  108. return (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0));
  109. }
  110.  
  111. /**
  112. * 获取干支纪年
  113. * @param year
  114. */
  115. function getLunarYearName($year)
  116. {
  117. $sky = array('庚', '辛', '壬', '癸', '甲', '乙', '丙', '丁', '戊', '己');
  118. $earth = array('申', '酉', '戌', '亥', '子', '丑', '寅', '卯', '辰', '巳', '午', '未');
  119. $year = $year . '';
  120. return $sky[$year{3}] . $earth[$year % 12];
  121. }
  122.  
  123. /**
  124. * 根据阴历年获取生肖
  125. * @param year 阴历年
  126. */
  127. function getYearZodiac($year)
  128. {
  129. $zodiac = array('猴', '鸡', '狗', '猪', '鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊');
  130. return $zodiac[$year % 12];
  131. }
  132.  
  133. /**
  134. * 获取阳历月份的天数
  135. * @param year 阳历-年
  136. * @param month 阳历-月
  137. */
  138. function getSolarMonthDays($year, $month)
  139. {
  140. $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);
  141. return $monthHash["$month"];
  142. }
  143.  
  144. /**
  145. * 获取阴历月份的天数
  146. * @param year 阴历-年
  147. * @param month 阴历-月,从一月开始
  148. */
  149. function getLunarMonthDays($year, $month)
  150. {
  151. $monthData = $this->getLunarMonths($year);
  152. return $monthData[$month - 1];
  153. }
  154.  
  155. /**
  156. * 获取阴历每月的天数的数组
  157. * @param year
  158. */
  159. function getLunarMonths($year)
  160. {
  161. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  162. $leapMonth = $yearData[0];
  163. $bit = decbin($yearData[3]);
  164. for ($i = 0; $i < strlen($bit); $i++) {
  165. $bitArray[$i] = substr($bit, $i, 1);
  166. }
  167. for ($k = 0, $klen = 16 - count($bitArray); $k < $klen; $k++) {
  168. array_unshift($bitArray, '0');
  169. }
  170. $bitArray = array_slice($bitArray, 0, ($leapMonth == 0 ? 12 : 13));
  171. for ($i = 0; $i < count($bitArray); $i++) {
  172. $bitArray[$i] = $bitArray[$i] + 29;
  173. }
  174. return $bitArray;
  175. }
  176.  
  177. /**
  178. * 获取农历每年的天数
  179. * @param year 农历年份
  180. */
  181. function getLunarYearDays($year)
  182. {
  183. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  184. $monthArray = $this->getLunarYearMonths($year);
  185. $len = count($monthArray);
  186. return ($monthArray[$len - 1] == 0 ? $monthArray[$len - 2] : $monthArray[$len - 1]);
  187. }
  188.  
  189. function getLunarYearMonths($year)
  190. {//debugger;
  191. $monthData = $this->getLunarMonths($year);
  192. $res = array();
  193. $temp = 0;
  194. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  195. $len = ($yearData[0] == 0 ? 12 : 13);
  196. for ($i = 0; $i < $len; $i++) {
  197. $temp = 0;
  198. for ($j = 0; $j <= $i; $j++) {
  199. $temp += $monthData[$j];
  200. }
  201. array_push($res, $temp);
  202. }
  203. return $res;
  204. }
  205.  
  206. /**
  207. * 获取闰月
  208. * @param year 阴历年份
  209. */
  210. function getLeapMonth($year)
  211. {
  212. $yearData = $this->lunarInfo[$year - $this->MIN_YEAR];
  213. return $yearData[0];
  214. }
  215.  
  216. /**
  217. * 计算阴历日期与正月初一相隔的天数
  218. * @param year
  219. * @param month
  220. * @param date
  221. */
  222. function getDaysBetweenLunar($year, $month, $date)
  223. {
  224. $yearMonth = $this->getLunarMonths($year);
  225. $res = 0;
  226. for ($i = 1; $i < $month; $i++) {
  227. $res += $yearMonth[$i - 1];
  228. }
  229. $res += $date - 1;
  230. return $res;
  231. }
  232.  
  233. /**
  234. * 计算2个阳历日期之间的天数
  235. * @param year 阳历年
  236. * @param cmonth
  237. * @param cdate
  238. * @param dmonth 阴历正月对应的阳历月份
  239. * @param ddate 阴历初一对应的阳历天数
  240. */
  241. function getDaysBetweenSolar($year, $cmonth, $cdate, $dmonth, $ddate)
  242. {
  243. $a = mktime(0, 0, 0, $cmonth, $cdate, $year);
  244. $b = mktime(0, 0, 0, $dmonth, $ddate, $year);
  245. return ceil(($a - $b) / 24 / 3600);
  246. }
  247.  
  248. /**
  249. * 根据距离正月初一的天数计算阴历日期
  250. * @param year 阳历年
  251. * @param between 天数
  252. */
  253. function getLunarByBetween($year, $between)
  254. {//debugger;
  255. $lunarArray = array();
  256. $yearMonth = array();
  257. $t = 0;
  258. $e = 0;
  259. $leapMonth = 0;
  260. $m = '';
  261. if ($between == 0) {
  262. array_push($lunarArray, $year, '正月', '初一');
  263. $t = 1;
  264. $e = 1;
  265. } else {
  266. $year = $between > 0 ? $year : ($year - 1);
  267. $yearMonth = $this->getLunarYearMonths($year);
  268. $leapMonth = $this->getLeapMonth($year);
  269. $between = $between > 0 ? $between : ($this->getLunarYearDays($year) + $between);
  270. for ($i = 0; $i < 13; $i++) {
  271. if ($between == $yearMonth[$i]) {
  272. $t = $i + 2;
  273. $e = 1;
  274. break;
  275. } else if ($between < $yearMonth[$i]) {
  276. $t = $i + 1;
  277. $e = $between - (empty($yearMonth[$i - 1]) ? 0 : $yearMonth[$i - 1]) + 1;
  278. break;
  279. }
  280. }
  281. $m = ($leapMonth != 0 && $t == $leapMonth + 1) ? ('闰' . $this->getCapitalNum($t - 1, true)) : $this->getCapitalNum(($leapMonth != 0 && $leapMonth + 1 < $t ? ($t - 1) : $t), true);
  282. array_push($lunarArray, $year, $m, $this->getCapitalNum($e, false));
  283. }
  284. array_push($lunarArray, $this->getLunarYearName($year));// 天干地支
  285. array_push($lunarArray, $t, $e);
  286. array_push($lunarArray, $this->getYearZodiac($year));// 12生肖
  287. array_push($lunarArray, $leapMonth);// 闰几月
  288. return $lunarArray;
  289. }
  290.  
  291. /**
  292. * 获取数字的阴历叫法
  293. * @param num 数字
  294. * @param isMonth 是否是月份的数字
  295. */
  296. function getCapitalNum($num, $isMonth)
  297. {
  298. $isMonth = $isMonth || false;
  299. $dateHash = array('0' => '', '1' => '一', '2' => '二', '3' => '三', '4' => '四', '5' => '五', '6' => '六', '7' => '七', '8' => '八', '9' => '九', '10' => '十 ');
  300. $monthHash = array('0' => '', '1' => '正月', '2' => '二月', '3' => '三月', '4' => '四月', '5' => '五月', '6' => '六月', '7' => '七月', '8' => '八月', '9' => '九月', '10' => '十月', '11' => '冬月', '12' => '腊月');
  301. $res = '';
  302. if ($isMonth) {
  303. $res = $monthHash[$num];
  304. } else {
  305. if ($num <= 10) {
  306. $res = '初' . $dateHash[$num];
  307. } else if ($num > 10 && $num < 20) {
  308. $res = '十' . $dateHash[$num - 10];
  309. } else if ($num == 20) {
  310. $res = "二十";
  311. } else if ($num > 20 && $num < 30) {
  312. $res = "廿" . $dateHash[$num - 20];
  313. } else if ($num == 30) {
  314. $res = "三十";
  315. }
  316. }
  317. return $res;
  318. }
  319.  
  320. /*class end*/
  321. }
  322.  
  323. header("Content-Type:text/html;charset=utf-8");
  324. $lunar = new Lunar();
  325. $month = $lunar->convertSolarToLunar('2017', '03', '09');//将阳历转换为阴历
  326. echo '<pre>';
  327. print_r($month);

php 公历农历互相转换的更多相关文章

  1. PHP日期操作类代码-农历-阳历转换、闰年、计算天数等

    <?php class Lunar { var $MIN_YEAR = 1891; var $MAX_YEAR = 2100; var $lunarInfo = array( array(0,2 ...

  2. php 公历阴历互相转换

    <?php /** * Created by PhpStorm. * User: timeless * Date: 17-3-9 * Time: 上午9:32 */ class Lunar { ...

  3. 个人永久性免费-Excel催化剂功能第34波-提取中国身份证信息、农历日期转换相关功能

    这两天又被刷朋友圈,又来了一个自主研发红芯浏览器,国产啊国产,这是谁的梦.就算国产了,自主了,无底线的夸大吹嘘无道德,企业如是,国家如是,大清已亡!再牛B的技术落在天天删敏感信息.无法治.无安全感可言 ...

  4. 完善SQL农历转换函数

    -------------------------------------------------------------------- --  Author : 原著:          改编:ht ...

  5. PHP 农历公历互转,八字排盘,星座,日历,支持从-1000到3000年间的排盘,二十四节气

    <?php /** * @author szargv@wo.cn * * 此日历转换类完全源于以下项目,感谢这两个项目作者的无私分享: * https://github.com/nozomi19 ...

  6. vue农历日历

    <template> <div class="calendar-main"> <div class="choose_year"&g ...

  7. 时间转换与星期推算(Matlab版)

    1 概述 最近在学习GPS解算算法时需要在GPS时(GPS周和周内秒)和公历日期之间进行转换,于是就整理了一些时间转换的小程序. 本文介绍了GPS时.公历.儒略日(JD).简化儒略日(MJD)之间的转 ...

  8. 个人永久性免费-Excel催化剂功能第90波-xml与json数据结构转换表格结构

    在网络时代,大量的数据交互以xml和json格式提供,特别是系统间的数据交互和网络WebAPI.WebService接口的数据提供,都是通过结构化的xml或json提供给其他应用调用返回数据.若能提供 ...

  9. 个人永久性免费-Excel催化剂功能第68波-父子结构表转换之父子关系BOM表拆分篇

    Excel中制造业行业中,有一个非常刚需的需求是对BOM(成品物料清单)的拆解,一般系统导出的BOM表,是经过压缩处理的,由父子表结构的方式存储数据.对某些有能力使用SAP等专业ERP软件的工厂来说, ...

随机推荐

  1. C语言超大数据相加计算整理

    在做ACM 1002题时,整理得到. #include<stdio.h>#include<string.h>#define MAX 1000void zero(char *s, ...

  2. mysql 创建视图

    1.单表创建视图 例如:创建一个选择语句,选出学生的编号,姓名和考号 //创建一个视图名字为stu_view1选择 来自数据表student中的id,name 和kn 中的数据 create view ...

  3. MQTT协议-MQTT协议简介及协议原理

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建 ...

  4. 「6月雅礼集训 2017 Day7」电报

    [题目大意] 有n个岛屿,第i个岛屿有有向发射站到第$p_i$个岛屿,改变到任意其他岛屿需要花费$c_i$的代价,求使得所有岛屿直接或间接联通的最小代价. $1 \leq n \leq 10^5, 1 ...

  5. 【Luogu】 P3928 SAC E#1 - 一道简单题 Sequence2

    [题目]洛谷10月月赛R1 提高组 [算法]递推DP+树状数组 [题解]列出DP递推方程,然后用树状数组维护前后缀和. #include<cstdio> #include<cstri ...

  6. 【vijos】P1083 小白逛公园

    [算法]线段树 [题解] 学自:https://vijos.org/p/1083/solution(wang_yanheng的回答) 回溯时维护一段区间的以下域: sumL:从左端点起连续区间的最大和 ...

  7. js jq插件 显示中文时间戳 刚刚 N分钟前 N小时前 今天 上午 下午 日期格式化

    注:页面需提前引用JQ ; $.fn.extend({ /* ** notes: 获取13位时间戳的简单操作 ** new Date('2018-02-01 15:10:00').getTime() ...

  8. Angular2.0 基础:双向数据绑定 [(ngModel)]

    在属性绑定中,值从模型到屏幕上的目标属性 (property). 通过把属性名括在方括号中来标记出目标属性,[]. 这是从模型到视图的单向数据绑定. 而在事件绑定中,值是从屏幕上的目标属性 到 mod ...

  9. php中类的static变量使用

    <?php #访问静态变量 #类外部: 类名::$类变量名 #类内部: 娄名::$类变量名或self::$类变量名 class Char{ public static $number = 0; ...

  10. Perl6 Bailador框架(6):获取用户输入

    use v6; use Bailador; get '/' => sub { ' <html> <head><title></title>< ...