Code
  1<?php
  2/**
  3* 公农历转换(1912 - 2012) 
  4
  5* Usage:
  6*   // 公历1983-10-5转农历
  7*   $lunar = new Lunar();
  8*   $date = $lunar->getLar('1983-10-5',0);
  9*   echo date("Y-m-d", $date);
 10*   // 农历1983-8-29转公历
 11*   $date = $lunar->getLar('1983-8-29',1);
 12*   echo date("Y-m-d", $date);
 13*
 14* @param string 日期
 15* @param int    日期历法
 16*      - 0 公历
 17*        1 农历
 18*
 19* @return timestamp
 20
 21    
 22   这是一个国历与农历互相转的Unit.
 23
 24   其中年份皆用民国年份, 请自行转换 (西元年-1911 = 民国年).
 25   ***************************************************************************
 26   *国农历对映表之说明 :                                                     *
 27   ***************************************************************************
 28   *  前二数字 = 闰月月份, 如果为 13 则没有闰月                              *
 29   *  第叁至第六数字 = 12 个月之大小月之2进位码->10进位                      *
 30   *  例如:                                                                  *
 31   *       101010101010 = 2730                                               *
 32   *       1 : 代表大月(30天) 0 : 代表小月(29天) ==> 1月大2月小3月大..    *
 33   *  第七位数字为闰月天数                                                   *
 34   *           0 : 没有闰月之天数                                            *
 35   *           1 : 闰月为小月(29天)                                          *
 36   *           2 : 闰月为大月(30天)                                          *
 37   *  最後2位数字代表阳历之1月1日与阴历之1月1日相差天数                      *
 38   ***************************************************************************
 39   这对映表只有民国一年至民国一百年, 如不敷您的使用请按照上述之方式自行增加.
 40
 41   这个程式没有判断您所输入之年,月,日是否正确, 请自行判断.
 42
 43   如果转换出来之农历的月份是闰月则传给您的值是***负数***
 44   如果农历要转换国历如果是闰月请输入***负数***
 45
 46   此版本为FreeWare   Version : 0.1
 47   您可以自行修改, 但最好可以将修改过之程式Mail一份给我.
 48   如果您要用於商业用途, 请mail给我告知您的用途及原因.
 49    
 50*/
 51
 52class Lunar {
 53    var $LMDay = array();
 54    var $InterMonth = 0;
 55    var $InterMonthDays = 0;
 56    var $SLRangeDay = 0;
 57
 58    var $SMDay = array(1 => 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
 59    var $LongLife = array( 1 =>
 60    '132637048', '133365036', '053365225', '132900044', '131386034', '022778122', //6
 61    '132395041', '071175231', '131175050', '132635038', '052891127', '131701046', //12
 62    '131748035', '042741223', '130694043', '132391032', '021327122', '131175040', //18
 63    '061623129', '133402047', '133402036', '051769125', '131453044', '130694034', //24
 64    '032158223', '132350041', '073213230', '133221049', '133402038', '063466226', //30
 65    '132901045', '131130035', '042651224', '130605043', '132349032', '023371121', //36
 66    '132709040', '072901128', '131738047', '132901036', '051333226', '131210044', //42
 67    '132651033', '031111223', '131323042', '082714130', '133733048', '131706038', //48
 68    '062794127', '132741045', '131206035', '042734124', '132647043', '131318032', //54
 69    '033878120', '133477039', '071461129', '131386047', '132413036', '051245126', //60
 70    '131197045', '132637033', '043405122', '133365041', '083413130', '132900048', //66
 71    '132922037', '062394227', '132395046', '131179035', '042711124', '132635043', //72
 72    '102855132', '131701050', '131748039', '062804128', '132742047', '132359036', //78
 73    '051199126', '131175045', '131611034', '031866122', '133749040', '081717130', //84
 74    '131452049', '132742037', '052413127', '132350046', '133222035', '043477123', //90
 75    '133402042', '133493031', '021877121', '131386039', '072747128', '130605048', //96
 76    '132349037', '053243125', '132709044', '132890033');
 77    
 78    function getLar($date, $isLunar = 1){
 79        list($year, $month, $day) = split("-", $date);
 80        if($isLunar == 1)
 81            return $this->Lunar2Solar($year, $month, $day);
 82        else
 83            return $this->Solar2Lunar($year, $month, $day);
 84    }
 85    
 86    function IsLeapYear($AYear){
 87      return ($AYear % 4 == 0) and (($AYear % 100 <> 0) or ($AYear % 400 == 0));
 88    }
 89    
 90    function CovertLunarMonth($magicno){
 91         $m = $magicno;
 92         for ($i = 12; $i >= 1; $i--){
 93             $size = $m % 2;
 94             if ($size == 0)
 95                $this->LMDay[$i] = 29;
 96             else
 97                $this->LMDay[$i] = 30;
 98             $m = floor($m / 2);
 99         }
100    }
101    
102    function ProcessMagicStr($yy){
103         $yy = $yy - 1911;
104         $magicstr = $this->LongLife[$yy];
105         $this->InterMonth = substr($magicstr, 0, 2);
106         $LunarMonth = substr($magicstr, 2, 4);
107         $this->CovertLunarMonth($LunarMonth);
108         $dsize = substr($magicstr, 6, 1);
109         switch ($dsize) {
110              case 0 : 
111                $this->InterMonthDays = 0;
112                break;
113              case 1 : 
114                $this->InterMonthDays = 29;
115                break;
116              case 2 : 
117                $this->InterMonthDays = 30;
118                break;
119         }
120         $this->SLRangeDay = substr($magicstr, 7, 2);
121    }
122    
123    function DaysPerLunarMonth($LYear, $LMonth){
124         $this->;ProcessMagicStr($LYear);
125         if ($LMonth < 0)
126            return $this->InterMonthDays;
127         else
128            return $this->LMDay[$LMonth];
129    }
130    
131    function Solar2Lunar($SYear, $SMonth, $SDay){
132         if( !(1912 <= $SYear && $SYear <= 2012) ){
133            return false;
134         }
135         $day = 0;
136         if ($this->isLeapYear($SYear))
137            $this->SMDay[2] = 29;
138         $this->;ProcessMagicStr($SYear);
139         if ($SMonth == 1)
140            $day = $SDay;
141         else {
142            for($i = 1; $i <= $SMonth-1; $i++)
143                $day = $day + $this->SMDay[$i];
144            $day = $day + $SDay;
145         }
146         if ($day <= $this->SLRangeDay) {
147            $day = $day - $this->SLRangeDay;
148            $this->processmagicstr($SYear-1);
149            for ($i = 12; $i >= 1; $i--){
150                $day = $day + $this->LMDay[$i];
151                if ($day > 0)
152                   break;
153            }
154            $LYear = $SYear - 1;
155            $LMonth = $i;
156            $LDay = $day;
157         } else {
158            $day = $day - $this->SLRangeDay;
159            for($i = 1; $i <= $this->InterMonth-1; $i++){
160                $day = $day - $this->LMDay[$i];
161                if ($day <= 0)
162                   break;
163            }
164            if ($day <= 0) {
165               $LYear = $SYear;
166               $LMonth = $i;
167               $LDay = $day + $this->LMDay[$i];
168            } else {
169               $day = $day - $this->LMDay[$this->InterMonth];
170               if ($day <= 0) {
171                  $LYear = $SYear;
172                  $LMonth = $this->InterMonth;
173                  $LDay = $day + $this->LMDay[$this->InterMonth];
174               } else {
175                  $this->LMDay[$this->InterMonth] = $this->InterMonthDays;
176                  for ($i = $this->InterMonth; $i <= 12; $i++){
177                      $day = $day - $this->LMDay[$i];
178                      if ($day <= 0)
179                         break;
180                  }
181                  if ($i == $this->InterMonth)
182                     $LMonth = 0 - $this->InterMonth;
183                  else
184                     $LMonth = $i;
185                  $LYear = $SYear;
186                  $LDay = $day + $this->LMDay[$i];
187               }
188            }
189         }
190         return mktime(0, 0, 0, $LMonth, $LDay, $LYear);
191    }
192    
193    function Lunar2Solar($LYear, $LMonth, $LDay){
194         if( !(1912 <= $LYear && $LYear <= 2012) ){
195            return false;
196         }
197         $day = 0;
198         $SYear = $LYear;
199         if ($this->isLeapYear($SYear))
200            $this->SMDay[2] = 29;
201         $this->processmagicstr($SYear);
202         if ($LMonth < 0)
203            $day = $this->LMDay[$this->InterMonth];
204         if ($LMonth <> 1)
205            for ($i = 1; $i <= $LMonth-1; $i++)
206                $day = $day + $this->LMDay[$i];
207         $day = $day + $LDay + $this->SLRangeDay;
208         if (($this->InterMonth <> 13) and ($this->InterMonth < $LMonth))
209            $day = $day + $this->InterMonthDays;
210         for ($i = 1; $i <= 12; $i++){
211             $day = $day - $this->SMDay[$i];
212             if ($day <= 0)
213                break;
214         }
215         if ($day > 0) {
216            $SYear = $SYear + 1;
217            if ($this->isLeapYear($SYear))
218               $this->SMDay[2] = 29;
219            for ($i = 1; $i <= 12; $i++){
220                $day = $day - $this->SMDay[$i];
221                if ($day <= 0)
222                   break;
223            }
224         }
225         $day = $day + $this->SMDay[$i];
226         $SMonth = $i;
227         $SDay = $day;
228         return mktime(0, 0, 0, $SMonth, $SDay, $SYear);
229    }
230}
231?>
232
233
234

转载于:https://www.cnblogs.com/zhaoshun/archive/2009/02/07/1385726.html

PHP公历农历转换(阴历阳历转换)阴历和阳历转换相关推荐

  1. JavaScript之js-calendar-converter插件的使用、日历、日期、转换、阳历、阴历、公历、农历、calendar

    文章目录 前言 下载js-calendar-converter插件 插件介绍 查询属性表 获取的方法 转换的方法 设置的方法 微信小程序查看效果 日历选择案例 前言 在做算命项目时遇到公历和农历相互转 ...

  2. PB中公历与农历(阳历与阴历)的互相转换——主要是农历转公历(阴历转阳历)

    PB中关于公历转农历的算法,网上有很多,思路也大致一样,在这里我就不再进行说明了. 本文主要是想跟所有PB爱好者,分享农历转公历的方法. 转换思路为:根据传入的农历日期,找到第一个小于传入日期的基准日 ...

  3. uniApp实现公农日历相互转换、公历、农历、阳历、阴历、calendar

    文章目录 前言 版本一 版本二 效果图 第一步,git下载组件 版本一 版本二 第二步,下载依赖包 第三步,使用 版本一 版本二 总结 版本一 版本二 微信小程序查看效果 关于js-calendar- ...

  4. python公历转农历_python 阳历转阴历代码(2)

    main.py #!/usr/bin/env python # -*- coding: utf-8 -*- #给出阳历日期转换成阴历日期 import math from daysbetween im ...

  5. 阳历、阴历、干支历转换 - For JAVA

    历法计算,可实现阳历.阴历.干支历的相互转换 一个可实现阳历.阴历.干支历间相互转换的JAVA工具 项目Github地址: https://github.com/opprime/calendarist ...

  6. java 公历 农历_java已知阳历日期求对应阴历日期源代码

    import java.text.*; import java.util.*; class ChineseCalendarGB { private int gregorianYear; private ...

  7. mysql将公历农历转换_php 公历农历如何实现转换

    php公历农历转换的实现方法:首先创建一个PHP示例文件,并设置该文件的编码为"utf-8":然后引入"lunar.php":接着通过"$lunar- ...

  8. python农历_Python如何实现阳历转阴历的方法分享

    展开全部 pip里有一个sxtwl的库.很方便的 pip install sxtwl  就能安装了. 如果e5a48de588b662616964757a686964616f3133336566356 ...

  9. php阳历转阴历(农历),阴历转阳历的方法

    2019独角兽企业重金招聘Python工程师标准>>> <?php header ( "Content-Type: text/html; charset=utf-8& ...

  10. php转字,PHP汉字拼音转换和公历农历转换

    1.PHP汉字转拼音 Pinyin.class.php类文件可以将大多数汉字转换成汉语拼音,当然也有个别生僻字不能转换,如果你想转换所有的汉字拼音的话,可能需要再配合一个汉字字库来实现,使用该类文件就 ...

最新文章

  1. 机器学习相关——SVD分解
  2. C#和C常用的API操作窗口的代码积累
  3. 10 Equality constrained minimization
  4. php的工作模式CGI,FastCGI,PHP-CGI与PHP-FPM(转)
  5. 酒泉于洋计算机学校,于洋
  6. Unity3d地形刷入自定义树木
  7. RMAN冷备份异机还原
  8. CentOS虚拟机挂载U盘
  9. vue element 实现树形菜单栏n层级分类,NavMenu menu
  10. Unicode与GBK互转
  11. export学习笔记(Es6阮一峰)
  12. 求勾股数c语言OJ,C语言求勾股数(详解版)
  13. 计算机辅助教学课件中的辅导型模式是以,【2017年整理】1、下面属于计算机辅助教学简称的是 ( ).doc...
  14. [BJDCTF2020]Mark loves cat 1——(超详细 三种方法)
  15. 杜比AC-3与DTS的音效对比 浅解
  16. 如何将VSCode添加到鼠标右键菜单
  17. 聚焦技术,锐意创新,GaussDB给世界一个更优选择
  18. 受保护的PDF文件如何编辑【PDF解密软件】
  19. KDB内核调试 - 1
  20. Java信息管理系统界面设计(包括登录界面及界面切换)

热门文章

  1. mysql数据库连接池锁_数据库连接池deadlock
  2. 个体工商户属于小微企业吗_个体户属于小微企业吗?
  3. 心电信号质量评估——ecg_qc工具包使用方法
  4. SSA优化章:SSA优化PID
  5. BJ模拟 Different Trips【树上后缀数组】
  6. python常用方法技巧使用总结
  7. 运行matlab报错 Runtime Error
  8. 微信生成海报 服务器性能,微信小程序生成清晰海报
  9. 淘宝店铺用ps+dw装修的步骤
  10. 用BVP一比一还原自如客APP裸眼3D效果(Android原生)