阴阴历阳历转换器阳历的函数公式

◇本站云标签公历和农历之间如何转换?
您的位置:&>>&&>>&&>>&正文
公历和农历之间如何转换?
    【字:
  很多人都一直在找换阴阳历的公式。我也尝试过。曾读过「高平子」天文前辈所着「学历散论」了解古历的变更和阴阳历的缺陷。才知道由於月球转动的不稳定不规则,确定无公式可寻。这也是古代中国每百年必改历的原因。
阴历最大的问题是在如何置闰。好像不难,因为阴历基本法则如下: * 月朔日即是初一  * 月以中气得名  * 以包含雨水中气月为正月,即是「寅」月  * 月无中气者为闰月,以前月同名   如果,日月转动循还有规则的话, 推演一套阴阳历转换的公式并不难。问题在有时一个太阴月比一个太阳月还要长。如此一个太阴月就有可能包括两个中气。此双中气月後的阴历月名就全部乱掉了,直到下一个「假」闰月後才调整过来。
  一般人接触到的阴阳历是民用历法,它是政府颁令的以东经120度计算的历法或称中原标准时间或北京时。如果,我们用不同时区、不同经度为子午线来重新计算阴阳历,民用历法的置闰法则出了很大的问题。不同时区的闰月可能落在不同月。换言之,在一百年内,任何两个时区的闰月顺序模式是会不相同的。
  高平子前辈书中提到了「历理置闰法」。如果应用历理置闰法到不同时区,则所有不同时区的闰月都落在相同月。如此不同时区、不同经度的阴阳历置闰之问题就消失了。民用置闰和历理置闰的不同是:
  * 在民用置闰,如果月朔日和中气同一天,则该阴历月包含那个中气。  * 在历理置闰,如果月朔日和中气同一天,月朔日时间必须在中气时间之前,则该阴历月才包含那个中气。
  简言之,民用置闰比较月朔和中气日期;历理置闰比较月朔和中气日期、时、分、秒。由此可知,没有精确的太阳和月亮的时间数字,阴历的闰月可能会排错了。
  基於这些理由,我着手寻找天文公式计算精确的太阳和月亮在纬度的时间。当年没有网路,发了大半年於美国南加州各大图书馆及大学,找寻答案。1993年出版了「中美天文」一书。书中精确的天文日月时间只从年。因恐2011後时间误差超过一分钟,不够精确,不敢印出。今年2002从网路资讯,确定太阳和月亮时间的精确度後,百忙中重新整理资料,提供给需要阴阳历转换公式的朋友。
  整理出的太阳和月亮时间数字是从西元1年到2246年。有历理和中国民用两套历法。数字内容清清楚楚的看出民用历法的敝端。例如,从西元1600年到2246年,民用历法双中气的阴历月有22个,历理历法只有5个。民用历法甚至在和2242年中,三个月之间居然跑出两个双中气;换言之,三个月中多出两个「假」闰月。前後12个阴历月中有三个闰月,闰月的去留造成许多学者的讨论和困恼。历理历法在此三年中,却没有发现到双中气阴历月。闰月的去留只要把双中气月後的「假」闰月取消,则历理历法近乎於完美。
  由此可知,民用历法问题很大,应该废除。上次阴阳历重大改历在1645年,已经超过350年。随着天文科学的进步,中国阴阳历应该使用较精确的历理历法。免得後代子孙再浪费时间讨论置闰去留的问题。
  阴阳历应用在八字算命、紫微斗数、农民历、遁甲历最多。很多人不知道排八字只用阳历而不用阴历。发了许多时间在研究阴阳历的转换。其实八字只使用太阳中,和月亮没有任何关系。紫微斗数则需要阴历日期去排命盘。美国时区的阴历日期有一半和中国时区的阴历日期差一天,因为时差超过12小时;初一就可能在不同日之故。有位在加拿大职业算命的朋友,精通八字和紫微斗数,研究其女命盘。八字论父母,合情合理。斗数父母宫,看不出自己影子。後来,在中美天文一书发现了「差一天」之解答。
  曾有一位退休博士用了近三十年找寻阴阳历的公式,问遍两岸各大天文台,得不到答案,直到发现中美天文一书。最後,希望我重新整理的中国阴阳历的天文数字和原始程式,能给有求知欲於阴阳历转换方法的读友一个答案,以免得不到答案而遗憾终身。
中国阴阳历的天文数字和原始程式用简单英文阐述,请从下述 Chinese Lunar Calendar。
--------------------------------------------------------------------------------高平子 Kao Ping Tse”〔是中国近代最有成就的天文学者之一。他没有接受正规的天文教育。凭着对天文的酷爱,自己研读天文书籍。因为他对天文的贡献,在他的百年冥诞,月球的一个环形月坑以他的名字为名。位置在月球东经87.6度,南纬6.7度, 直径34公里,为国争光。
相关连接:??php阳历转阴历(农历),阴历转阳历的方法
 由于最近一个项目设计到将阳历转阴历从而得到相应节日的算法,对这方面不是很了解,于是就在网上搜了一圈。不错,还算是找到一个比较不错的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){//
$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&$$i++){
$array=$this-&getLunarByBetween($year,$this-&getDaysBetweenSolar($year,$month,$i,$yearData[1],$yearData[2]));
$array[]=$year.'-'.$month.'-'.$i;
$lunar_ary[$i]=$
return $lunar_
* 将阴历转换为阳历
* @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&$$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 $bitA
* 获取农历每年的天数
* @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){//
$monthData=$this-&getLunarMonths($year);
$res=array();
$yearData=$this-&lunarInfo[$year-$this-&MIN_YEAR];
$len=($yearData[0]==0?12:13);
for($i=0;$i&$$i++){
for($j=0;$j&=$i;$j++){
$temp+=$monthData[$j];
array_push($res,$temp);
* 获取闰月
* @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);
for($i=1;$i&$$i++){
$res+=$yearMonth[$i-1];
$res+=$date-1;
* 计算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){//
$lunarArray=array();
$yearMonth=array();
$leapMonth=0;
if($between==0){
array_push($lunarArray,$year,'正月','初一');
$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]){
}else if($between&$yearMonth[$i]){
$e=$between-(empty($yearMonth[$i-1])?0:$yearMonth[$i-1])+1;
$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 $lunarA
* 获取数字的阴历叫法
* @param num 数字
* @param isMonth 是否是月份的数字
function getCapitalNum($num,$isMonth){
$isMonth=$isMonth||
$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'=&'腊月');
if($isMonth){
$res=$monthHash[$num];
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="三十";
使用方法如下:
header("Content-Type:text/charset=utf-8");
$lunar=new Lunar();///php-function/867.html
$month=$lunar-&convertSolarToLunar();//将阳历转换为阴历
echo '&pre&';
print_r($month);
打印结果如下:
    [0] =& 2013
    [1] =& 五月
    [2] =& 三十
    [3] =& 癸巳
    [4] =& 5
    [5] =& 30
    [6] =& 蛇
    [7] =& 0
具体数组中各个元素代表什么意思,这里就不用解释了吧。您可能感兴趣的文章转载请注明出处:本文永久地址:文章来源:-わ千与千寻上一篇:下一篇:热门文章随机文章您的位置:
本文网址:
栏目分类??????????????????????????????????特别关注热门排行推荐信息相关信息
页面执行时间1.4063秒 查询数据库76次

我要回帖

更多关于 阴历阳历转换器 的文章

 

随机推荐