Fork me on GitHub

计算两个日期之间相差的年数月数天数(JS实现)

前言

如何计算年龄?我的第一直觉做法:(当前时间戳 - 出生时的时间戳)/ (365*86400)  所得结果向下取整。后来发现这种做法获得的结果不准确,不是多了一岁就是少了一岁,不能简单粗暴的这么处理,只能把相差的年数月数天数精确的算出来。我一开始以为这个很简单,这个问题不值得记录下来,后来发现不是这么一回事,实现起来没有那么顺利,对我而言。

闰年

要计算2个日期之间的相差的时间,肯定需要知道闰年是咋回事。地球绕太阳公转一圈的时间即为公历一年的时间,地球公转花的时间大概是365天5小时48分,这样每隔4年差不多公历时间多出了一天,这一年天文学家称之为闰年,闰年的2月份是29天。前人总结出来闰年的判断方法:年份能被400整除或者年份不能被100整除且能被4整除。(备注:我对公农历不是很了解,这些信息也是从网上找到的,我对这些不是很感兴趣,没有花更多的时间深入的了解)

实现

先算出相差的年数,再算相差的月数,最后计算相差的天数,思路很简单,真正的实现不是一帆风顺。

代码

 

  1 /**
  2  * @desc 计算年龄
  3  * 计算年份->计算月份->计算天数
  4  *
  5  * @date 2015-09-22
  6  * @author WadeYu
  7  */
  8  
  9 var getDiffYmdBetweenDate = function(sDate1,sDate2){
 10     var fixDate = function(sDate){
 11         var aD = sDate.split('-');
 12         for(var i = 0; i < aD.length; i++){
 13             aD[i] = fixZero(parseInt(aD[i]));
 14         }
 15         return aD.join('-');
 16     };
 17     var fixZero = function(n){
 18         return n < 10 ? '0'+n : n;
 19     };
 20     var fixInt = function(a){
 21         for(var i = 0; i < a.length; i++){
 22             a[i] = parseInt(a[i]);
 23         }
 24         return a;
 25     };
 26     var getMonthDays = function(y,m){
 27         var aMonthDays = [0,31,28,31,30,31,30,31,31,30,31,30,31];
 28         if((y%400 == 0) || (y%4==0 && y%100!=0)){
 29             aMonthDays[2] = 29;
 30         }
 31         return aMonthDays[m];
 32     };
 33     var checkDate = function(sDate){
 34     };
 35     var y = 0;
 36     var m = 0;
 37     var d = 0;
 38     var sTmp;
 39     var aTmp;
 40     sDate1 = fixDate(sDate1);
 41     sDate2 = fixDate(sDate2);
 42     if(sDate1 > sDate2){
 43         sTmp = sDate2;
 44         sDate2 = sDate1;
 45         sDate1 = sTmp;
 46     }
 47     var aDate1 = sDate1.split('-');
 48         aDate1 = fixInt(aDate1);
 49     var aDate2 = sDate2.split('-');
 50         aDate2 = fixInt(aDate2);
 51     //计算相差的年份
 52     /*aTmp = [aDate1[0]+1,fixZero(aDate1[1]),fixZero(aDate1[2])];
 53     while(aTmp.join('-') <= sDate2){
 54         y++;
 55         aTmp[0]++;
 56     }*/
 57     y = aDate2[0] - aDate1[0];
 58     if( sDate2.replace(aDate2[0],'') < sDate1.replace(aDate1[0],'')){
 59         y = y - 1;
 60     }
 61     //计算月份
 62     aTmp = [aDate1[0]+y,aDate1[1],fixZero(aDate1[2])];
 63     while(true){
 64         if(aTmp[1] == 12){
 65             aTmp[0]++;
 66             aTmp[1] = 1;
 67         }else{
 68             aTmp[1]++;
 69         }
 70         if(([aTmp[0],fixZero(aTmp[1]),aTmp[2]]).join('-') <= sDate2){
 71             m++;
 72         } else {
 73             break;
 74         }
 75     }
 76     //计算天数
 77     aTmp = [aDate1[0]+y,aDate1[1]+m,aDate1[2]];
 78     if(aTmp[1] > 12){
 79         aTmp[0]++;
 80         aTmp[1] -= 12;
 81     }
 82     while(true){
 83         if(aTmp[2] == getMonthDays(aTmp[0], aTmp[1])){
 84             if(aTmp[1] == 12){
 85                 aTmp[0]++;
 86                 aTmp[1]=1;
 87                 aTmp[2]=1;
 88             }else{
 89                 aTmp[1]++;
 90                 aTmp[2] = 1;
 91             }
 92         }else {
 93             aTmp[2]++;
 94         }
 95         sTmp = ([aTmp[0],fixZero(aTmp[1]),fixZero(aTmp[2])]).join('-');
 96         if(sTmp <= sDate2){
 97             d++;
 98         } else {
 99             break;
100         }
101     }
102     return {y:y,m:m,d:d};
103 };
104  
105 var aTest = [
106     ['1984-9-17','2015-8-15'],
107     ['1984-9-17','1985-9-18'],
108     ['1984-9-17','1984-10-17'],
109     ['1984-9-17','1984-10-10'],
110     ['2021-07-15','2022-01-14'],
111 ];
112 for(var i = 0; i < aTest.length; i++){
113     console.log(aTest[i][0]+':'+aTest[i][1]);
114     console.log(getDiffYmdBetweenDate(aTest[i][0],aTest[i][1]));
115 }

 

 

 

后记

1.这个问题的实现花了一些时间思考,一开始不是很想记录下,后来想想毕竟是花了时间思考,现在健忘比较严重,还是记录下吧。

2.跟同事讨论,年龄计算是否需要包含当天生日那天,讨论的结果是不包含,没过生日这天年龄不增加,也算刷新了一个基本常识吧。

3.能算出相差的年数月数天数,如果只需要计算总天数或者总月数就很简单了。

4.农历年份会变化,不能根据农历日期来算年龄

5.PHP农历公历转换类,感谢此类的作者

<?php
/**
 * 阴历,阳历,日历转换
 */
class o_calendar {
	public static $MIN_YEAR = 1600;
	public static $MAX_YEAR = 2200;
	//public static $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,31,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));
 	public static $lunarInfo = array(array(0,2,15,9680),array(0,2,3,37584),array(3,1,23,51544),array(0,2,11,43344),array(7,1,31,46248),array(0,2,18,27296),array(0,2,7,44368),array(6,1,28,21928),array(0,2,16,19360),array(0,2,4,42416),array(4,1,25,21176),array(0,2,13,21168),array(0,2,2,26928),array(2,1,21,29864),array(0,2,9,27296),array(6,1,29,44368),array(0,2,17,39760),array(0,2,6,19296),array(4,1,26,42352),array(0,2,14,42224),array(0,2,4,21088),array(3,1,22,59696),array(0,2,10,54576),array(8,1,31,23208),array(0,2,19,22176),array(0,2,7,38608),array(5,1,28,19176),array(0,2,16,19152),array(0,2,5,42192),array(4,1,24,53864),array(0,2,12,45648),array(0,2,1,54560),array(2,1,21,55968),array(0,2,8,46496),array(6,1,29,38352),array(0,2,17,38320),array(0,2,7,18864),array(5,1,26,42168),array(0,2,14,42160),array(0,2,3,43600),array(3,1,23,46376),array(0,2,10,27968),array(0,1,30,44448),array(0,2,18,43872),array(0,2,8,37744),array(5,1,28,18808),array(0,2,16,18800),array(0,2,5,25776),array(4,1,25,27216),array(0,2,11,55888),array(0,2,1,27424),array(1,1,21,43872),array(0,2,9,43744),array(6,1,29,37608),array(0,2,17,37600),array(0,2,6,51552),array(5,1,26,54440),array(0,2,13,54432),array(0,2,2,55888),array(3,1,23,23208),array(0,2,11,22176),array(8,1,30,42704),array(0,2,18,42448),array(0,2,8,37584),array(6,1,28,43352),array(0,2,15,43344),array(0,2,4,46240),array(4,1,24,46416),array(0,2,12,44368),array(0,2,1,21920),array(2,1,21,42448),array(0,2,9,42416),array(7,1,30,21176),array(0,2,17,21104),array(0,2,6,26928),array(5,1,26,29864),array(0,2,14,27296),array(0,2,2,44368),array(3,1,23,19880),array(0,2,11,19296),array(8,1,31,42352),array(0,2,18,42208),array(0,2,7,53856),array(6,1,27,59696),array(0,2,15,54560),array(0,2,3,55968),array(4,1,24,23376),array(0,2,12,22224),array(0,2,2,19168),array(3,1,21,42216),array(0,2,9,42192),array(7,1,29,53848),array(0,2,17,43600),array(0,2,5,46368),array(5,1,25,54944),array(0,2,13,46496),array(0,2,3,21968),array(3,1,23,19160),array(0,2,11,18864),array(7,1,31,42168),array(0,2,19,42160),array(0,2,8,43600),array(6,1,28,46376),array(0,2,16,27936),array(0,2,5,44384),array(4,1,25,21936),array(0,2,13,37744),array(0,2,3,18800),array(3,1,23,42168),array(0,2,10,25776),array(7,1,30,27216),array(0,2,17,55888),array(0,2,7,23200),array(5,1,26,43856),array(0,2,14,43744),array(0,2,4,21216),array(3,1,24,51568),array(0,2,11,51552),array(8,1,31,54440),array(0,2,19,54432),array(0,2,8,54608),array(6,1,28,23208),array(0,2,16,22176),array(0,2,5,42704),array(4,1,26,21224),array(0,2,13,21200),array(0,2,2,43344),array(2,1,22,54440),array(0,2,10,45728),array(7,1,29,46416),array(0,2,17,44368),array(0,2,7,19872),array(5,1,27,42448),array(0,2,14,42416),array(0,2,4,21168),array(4,1,24,43192),array(0,2,12,26928),array(9,1,31,27288),array(0,2,19,27296),array(0,2,8,43856),array(6,1,29,19880),array(0,2,16,19296),array(0,2,5,42352),array(4,1,26,20848),array(0,2,13,53600),array(0,2,1,59696),array(3,1,22,27280),array(0,2,9,55968),array(7,1,30,23376),array(0,2,17,22224),array(0,2,7,19168),array(5,1,27,42216),array(0,2,15,41680),array(0,2,3,53584),array(4,1,23,54440),array(0,2,11,46368),array(9,1,31,54928),array(0,2,18,44448),array(0,2,8,21968),array(6,1,29,10968),array(0,2,17,17840),array(0,2,5,41648),array(5,1,25,45400),array(0,2,13,43344),array(0,2,2,46368),array(2,1,21,46480),array(0,2,9,44384),array(7,1,30,21936),array(0,2,18,21360),array(0,2,7,17776),array(5,1,27,25272),array(0,2,15,21168),array(0,2,4,26960),array(3,1,23,27816),array(0,2,11,23200),array(10,1,31,43856),array(0,2,19,42704),array(0,2,8,19168),array(6,1,28,42352),array(0,2,16,42336),array(0,2,5,53920),array(5,1,24,59728),array(0,2,12,54608),array(0,2,2,23200),array(3,1,22,43856),array(0,2,9,42704),array(7,1,30,19176),array(0,2,18,19120),array(0,2,7,43216),array(5,1,26,53864),array(0,2,14,45728),array(0,2,3,46416),array(4,1,24,22184),array(0,2,11,19872),array(0,1,31,38320),array(2,1,21,19128),array(0,2,9,18864),array(6,1,28,43192),array(0,2,16,25776),array(0,2,5,27280),array(4,1,25,46416),array(0,2,13,27472),array(0,2,3,11168),array(2,1,23,38320),array(0,2,11,37744),array(7,1,31,20848),array(0,2,18,53600),array(0,2,7,58544),array(5,1,28,27280),array(0,2,14,55952),array(0,2,4,23376),array(3,1,25,11112),array(0,2,13,10976),array(0,2,1,37600),array(2,1,21,53608),array(0,2,9,51536),array(6,1,29,54440),array(0,2,16,46240),array(0,2,5,46736),array(4,1,26,22224),array(0,2,14,21936),array(0,2,3,9680),array(3,1,23,41688),array(0,2,11,37552),array(7,1,31,43352),array(0,2,18,43344),array(0,2,7,46240),array(5,1,27,46416),array(0,2,15,44368),array(0,2,4,21936),array(4,1,25,9656),array(0,2,13,9584),array(9,2,2,21176),array(0,2,20,21168),array(0,2,9,26960),array(6,1,29,27816),array(0,2,17,23200),array(0,2,5,43856),array(4,1,26,21352),array(0,2,14,19168),array(0,2,3,42352),array(3,1,23,21168),array(0,2,10,53856),array(7,1,30,59728),array(0,2,18,54608),array(0,2,7,23200),array(5,1,27,43728),array(0,2,15,38352),array(0,2,5,19168),array(4,1,24,42200),array(0,2,12,42192),array(8,2,1,53848),array(0,2,20,45712),array(0,2,8,46416),array(7,1,29,22184),array(0,2,17,11680),array(0,2,6,38320),array(5,1,26,19128),array(0,2,14,18864),array(0,2,3,42160),array(3,1,23,45656),array(0,2,10,27216),array(8,1,30,44360),array(0,2,18,27472),array(0,2,8,11104),array(5,1,27,38320),array(0,2,15,37744),array(0,2,5,18800),array(4,1,25,25776),array(0,2,11,54432),array(10,1,31,59984),array(0,2,19,55952),array(0,2,9,23248),array(6,1,29,11112),array(0,2,17,10976),array(0,2,6,37600),array(5,1,26,51560),array(0,2,13,51536),array(0,2,2,54432),array(3,1,22,55888),array(0,2,10,46672),array(7,1,30,22224),array(0,2,18,21936),array(0,2,8,9680),array(5,1,28,37592),array(0,2,15,37552),array(0,2,4,43344),array(4,1,24,46248),array(0,2,12,46240),array(0,1,31,46416),array(2,1,21,22184),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,31,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),array(7,1,29,55952),array(0,2,17,46496),array(0,2,7,21968),array(5,1,28,19160),array(0,2,15,18864),array(0,2,4,42160),array(4,1,24,53848),array(0,2,12,43600),array(9,1,31,46376),array(0,2,19,27936),array(0,2,8,44384),array(6,1,29,21936),array(0,2,16,37744),array(0,2,6,18800),array(4,1,26,25784),array(0,2,14,21680),array(0,2,2,27216),array(3,1,22,27944),array(0,2,10,27296),array(7,1,30,43856),array(0,2,17,43728),array(0,2,7,21216),array(5,1,27,51568),array(0,2,15,43360),array(0,2,3,54432),array(4,1,23,59984),array(0,2,11,55632),array(0,2,1,23200),array(0,2,19,22176),array(0,2,8,42704),array(6,1,29,21224),array(0,2,17,21200),array(0,2,5,43216),array(5,1,25,54440),array(0,2,13,45728),array(0,2,2,46416),array(2,1,22,22184),array(0,2,10,21920),array(7,1,30,42448),array(0,2,18,42416),array(0,2,7,21168),array(5,1,27,43192),array(0,2,15,26800),array(0,2,4,29328),array(4,1,23,46416),array(0,2,11,27472),array(0,2,1,11680),array(0,2,20,19296),array(0,2,8,42352),array(6,1,29,20848),array(0,2,16,53600),array(0,2,5,59568),array(5,1,25,27280),array(0,2,12,55952),array(0,2,2,23376),array(3,1,23,11112),array(0,2,10,10976),array(7,1,30,41704),array(0,2,18,41680),array(0,2,7,53584),array(6,1,26,54440),array(0,2,14,46368),array(0,2,3,54928),array(4,1,24,23248),array(0,2,11,21936),array(10,2,1,10968),array(0,2,20,17840),array(0,2,9,41648),array(6,1,28,43352),array(0,2,16,43344),array(0,2,5,46240),array(5,1,25,46416),array(0,2,12,44368),array(0,2,2,21936),array(3,1,23,9656),array(0,2,11,17776),array(7,1,30,25272),array(0,2,18,21168),array(0,2,7,26960),array(6,1,27,27816),array(0,2,14,23200),array(0,2,3,43856),array(4,1,24,21352),array(0,2,12,19168),array(0,1,31,42352),array(2,1,21,21168),array(0,2,8,53920),array(6,1,28,59728),array(0,2,15,54608),array(0,2,5,23200),array(5,1,25,43856),array(0,2,13,42704),array(0,2,2,19168),array(3,1,22,42328),array(0,2,10,42192),array(7,1,30,53848),array(0,2,17,45712),array(0,2,6,46416),array(6,1,27,22184),array(0,2,15,11680));

	/**
	 * 将阳历转换为阴历
	 * @param year 公历-年
	 * @param month 公历-月
	 * @param date 公历-日
	 */
	public static function convertSolarToLunar($year,$month,$date){
		$yearData = self::$lunarInfo[$year-self::$MIN_YEAR];
		if($year==self::$MIN_YEAR&&$month<=2&&$date<=9){
			return array('1891-01-01',false);
		}
		$ret = self::getLunarByBetween($year,self::getDaysBetweenSolar($year,$month,$date,$yearData[1],$yearData[2]));
		$ret[0] = fn::formatDate($ret[0]);
		return $ret;
	}
 
	/**
	* 将阴历转换为阳历
	* @param year 阴历-年
	* @param month 阴历-月,闰月处理:例如如果当年闰五月,那么第二个五月就传六月,相当于阴历有13个月,只是有的时候第13个月的天数为0
	* @param date 阴历-日
	*/
	public static function convertLunarToSolar($year,$month,$date){
		$yearData = self::$lunarInfo[$year-self::$MIN_YEAR];
		$between = self::getDaysBetweenLunar($year,$month,$date);
		$res = mktime(0,0,0,$yearData[1],$yearData[2],$year);
 
		return date('Y-m-d',$res+$between*24*60*60);
	}
 
	/**
	 * 判断是否是闰年
	 * @param year
	 */
	public static function isLeapYear($year){
		return (($year%4==0 && $year%100 !=0) || ($year%400==0));
	}
 
	/**
	 * 获取干支纪年
	 * @param year
	 */
	public static function getLunarYearName($year){
		 $sky = array('庚','辛','壬','癸','甲','乙','丙','丁','戊','己');
		 $earth = array('申','酉','戌','亥','子','丑','寅','卯','辰','巳','午','未');
 
		 $year = $year.'';
		 return $sky[$year{3}].$earth[$year%12];
	}
 
	/**
	 * 根据阴历年获取生肖
	 * @param year 阴历年
	 */
	public static function getYearZodiac($year){
		 $zodiac = array('猴','鸡','狗','猪','鼠','牛','虎','兔','龙','蛇','马','羊');
		 return $zodiac[$year%12];
	}
 
	/**
	 * 获取阳历月份的天数
	 * @param year 阳历-年
	 * @param month 阳历-月
	 */
	public static function getSolarMonthDays($year,$month){
		 $monthHash = array('1'=>31,'2'=>self::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 阴历-月,从一月开始
	 */
	public static function getLunarMonthDays($year,$month){
		 $monthData = self::getLunarMonths($year);
		 return $monthData[$month-1];
	}
 
	/**
	 * 获取阴历每月的天数的数组
	 * @param year
	 */
	public static function getLunarMonths($year){
 
		$yearData = self::$lunarInfo[$year - self::$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 农历年份
	 */
	public static function getLunarYearDays($year){
		$yearData = self::$lunarInfo[$year-self::$MIN_YEAR];
		$monthArray = self::getLunarYearMonths($year);
		$len = count($monthArray);
		return ($monthArray[$len-1]==0?$monthArray[$len-2]:$monthArray[$len-1]);
	}
 
	public static function getLunarYearMonths($year){
		 //debugger;
		$monthData = self::getLunarMonths($year);
		$res=array();
		$temp=0;
		$yearData = self::$lunarInfo[$year-self::$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 阴历年份
	 */
	public static function getLeapMonth($year){
		$yearData = self::$lunarInfo[$year-self::$MIN_YEAR];
		return $yearData[0];
	}
 
	/**
	 * 计算阴历日期与正月初一相隔的天数
	 * @param year
	 * @param month
	 * @param date
	 */
	public static function getDaysBetweenLunar($year,$month,$date){
		$yearMonth = self::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 阴历初一对应的阳历天数
	 */
	public static 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 天数
	 */
	public static function getLunarByBetween($year,$between){
		//debugger;
		$lunarArray = array();
		$yearMonth=array();
		$t=0;
		$e=0;
		$leapMonth=0;
		$m='';
 		$isLeap = false;
		if($between==0){
			array_push($lunarArray, $year,'正月','初一');
			$t = 1;
			$e = 1;
			$month = $t;
		}else{
			$year = $between>0? $year : ($year-1);
			$yearMonth = self::getLunarYearMonths($year);
			$leapMonth = self::getLeapMonth($year);
			$between = $between>0?$between : (self::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;
				}
			}
			
			if ($leapMonth!=0&&$t==$leapMonth+1) {
				$month = $t- 1;
				$isLeap = true;
			}else{
				$month = $leapMonth!=0&&$leapMonth+1<$t?($t-1):$t;
				$isLeap;
			}
			//$m = ($leapMonth!=0&&$t==$leapMonth+1)?('闰'.self::getCapitalNum($t- 1,true)):self::getCapitalNum(($leapMonth!=0&&$leapMonth+1<$t?($t-1):$t),true);
 
			//array_push($lunarArray,$year,$m,self::getCapitalNum($e,false));
		}
		
		return array($year . '-' . $month . '-' . $e, $isLeap);
		//array_push($lunarArray,self::getLunarYearName($year));//天干地支
		//array_push($lunarArray,$t,$e);
		//array_push($lunarArray,self::getYearZodiac($year));//12生肖
		//array_push($lunarArray,$leapMonth);//闰几月
		//return $lunarArray;
	}
 
	/**
	 * 获取数字的阴历叫法
	 * @param num 数字
	 * @param isMonth 是否是月份的数字
	 */
	public static 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;
	}
	/**
	 * 
	 * @param unknown $y
	 * @param unknown $m
	 * @param unknown $d
	 * @param unknown $time
	 */
	public static function getSolarAndLunarTime($y, $m, $d , $time){
		$aTime = explode(':', $time);
		$sSolar = $y . cfg::lang('year') . $m . cfg::lang('month') . $d . cfg::lang('day') . ' ' . $aTime[0] . cfg::lang('hour') . $aTime[1] . cfg::lang('minute');
		
		$aLunarRes = calendarswach::convertSolarToLunar($y, $m, $d);
		$lunarDate = $aLunarRes[0];//阴历日期
		$isLeap = $aLunarRes[1];//是否闰月
		$aLunar = explode('-', $lunarDate);
		$blockNumber = cfg::lang('blockNumber');
		$lunarY = $blockNumber[intval($aLunar[0]{0})] . $blockNumber[intval($aLunar[0]{1})] . $blockNumber[intval($aLunar[0]{2})] . $blockNumber[intval($aLunar[0]{3})];
		$calendarLang = cfg::lang('calendar');
		$lunarM = $calendarLang['month'][intval($aLunar[1])];
		if ($isLeap) {
			$lunarM = cfg::lang('leap') . $lunarM;
		}
		$lunarD = $calendarLang['date'][intval($aLunar[2])];
		
		$aTime = explode(':', $time);
		$tempHour = ($aTime[0] % 2) == 0 ? $aTime[0] + 2 : $aTime[0] + 3; //奇数+3 偶数 +2
		$tempHour = $tempHour % 24;
		$hourDiZhi = $tempHour / 2; //每两小时一个时辰
		if ($hourDiZhi == 0) {
			$hourDiZhi = 12;
		}
		$lang = cfg::lang('diZhi');
		
		$lunarH = $lang[$hourDiZhi] . cfg::lang('lunarhour');
		
		return array('solar' => $sSolar,
					 'lunar' => $lunarY . cfg::lang('year') . $lunarM . $lunarD . cfg::lang('day') .  ' ' . $lunarH);
	}
///新加的
	/**
	 *
	 * @param unknown $sdate
	 * @param unknown $edate
	 */
	public static function getGapDays($sdate, $edate){
		if($sdate > $edate){
			return 0;
		}
		$aSdate = explode('-', $sdate);
		$aEdate = explode('-', $edate);
		$sYear = $aSdate[0];
		$sMonth = (int)$aSdate[1];
		$sDate = (int)$aSdate[2];
	
		$eYear = $aEdate[0];
		$eMonth = (int)$aEdate[1];
		$eDate = (int)$aEdate[2];
	
		$allDays = $yearDays = 0;
		//同一年
		if($sYear == $eYear){
			if($sMonth == $eMonth){
				//同一个月
				return $eDate - $sDate;
			}
			//不同月
			$isLeap = self::isLeapYear($sYear);
			$loopMonth = $sMonth;
			while ($loopMonth <= $eMonth){
				if($loopMonth == $sMonth){
					$monDays = self::getMonthDays($loopMonth, $isLeap);
					$allDays += ($monDays - $sDate);//加上这个月剩余的天数
				}elseif ($loopMonth == $eMonth){
					$allDays += $eDate;//加上末月日期数
				}else {
					$monDays = self::getMonthDays($loopMonth, $isLeap);
					$allDays += $monDays;//加上这个月的天数
				}
				$loopMonth++;
			}
			return $allDays;
		}
		//跨年
		$aLeapAndGeneral = self::getLongYearsLeapAndGeneral($sYear, $eYear);
	
		$yearDays = $aLeapAndGeneral['leapYears'] * 366 + $aLeapAndGeneral['generalYears'] * 365;
		//var_dump($aLeapAndGeneral,$yearDays, $sYear, $eYear, $allDays);
		//计算首尾
	
		$loopMonth = $sMonth;
		$loopYear = $sYear;
		$isLeap = self::isLeapYear($loopYear);
		while (1){
			if(($loopMonth == $sMonth) && ($loopYear == $sYear) ){
				$monDays = self::getMonthDays($loopMonth, $isLeap);
				$allDays += ($monDays - $sDate);//加上这个月剩余的天数
			}elseif (($loopMonth == $eMonth) && ($loopYear == $eYear) ){
				$allDays += $eDate;//加上末月日期数
				break;
			}else {
				$monDays = self::getMonthDays($loopMonth, $isLeap);
				$allDays += $monDays;//加上这个月的天数
			}
			$loopMonth++;
			if($loopMonth == 13){
				//转到尾年
				$loopMonth = 1;//从1月份开始计算
				$loopYear = $eYear;
				$isLeap = self::isLeapYear($loopYear);
			}
		}
		//var_dump($yearDays, $allDays);
		$allDays += $yearDays;
	
		return $allDays;
	}
	
	//计算差距2年(含2年)以上的闰年和平年年
	//不含边界
	public static function getLongYearsLeapAndGeneral($sYear, $eYear){
		$sYear = (int)$sYear;
		$eYear = (int)$eYear;
		$gapYears = $eYear - $sYear;
		if($gapYears < 2){
			return array('leapYears' => 0, 'generalYears' => 0);
		}
	
		$leapYears = $generalYears = 0;
		$firstLeapYear = ++$sYear;
		$endLeapYear = --$eYear;
	
		//5年以内
		if($gapYears < 10){
			while ($firstLeapYear <= $endLeapYear){
				if(self::isLeapYear($firstLeapYear)){
					$leapYears++;
				}else {
					$generalYears++;
				}
				$firstLeapYear++;
			}
			return array('leapYears' => $leapYears, 'generalYears' => $generalYears);
		}
		//超过5年
		//首先找到开始年的下一个闰年
		$sEgeneralYears = 0;
		for ($i = 0; $i < 5; $i++){
			if(self::isLeapYear($firstLeapYear)){
				break;
			}
			$sEgeneralYears++;
			$firstLeapYear++;
		}
		//找到最后一个闰年
		for ($i = 0; $i < 5; $i++){
			if(self::isLeapYear($endLeapYear)){
				break;
			}
			$sEgeneralYears++;
			$endLeapYear--;
		}
		//整百的1700 1800 1900 2100 不是瑞年
		$noleap100th = self::get100th($firstLeapYear, $endLeapYear);
		$modGapYears = $endLeapYear - $firstLeapYear;
		$leapYears = ($modGapYears) / 4;
		$generalYears = $leapYears * 3;
	
		$leapYears = $leapYears + 1 - $noleap100th;//加上边界  减去整100
		$generalYears += $noleap100th;//加上整100平年
		//加上收尾的平年
		$generalYears += $sEgeneralYears;
		return array('leapYears' => $leapYears, 'generalYears' => $generalYears);
	}
	//整百的1700 1800 1900 2100 不是瑞年
	public static function get100th($sy, $ey){
		$c = 0;
		foreach (array(1700,1800,1900,2100) as $y){
			if ($sy <= $y && $y<= $ey) {
				$c++;
			}
		}
		return $c;
	}
	//获取公历月份天数
	public static function getMonthDays($month, $isLeap){
		$month = (int)$month;
		if ($month == 2) {
			return $isLeap ? 29 : 28;
		}
		//1-12月分别为31天,29天,31天,30天,31天,30天,31天,31天,30天,31天,30天,31天
		return in_array($month, array(1,3,5,7,8,10,12)) ? 31 : 30;
	}
	//获取年干支
	public static function getYearGanZhi( $year){
		$year = (int)$year;
		//计算年柱时用的天干/地支排列
		$aYearZhuTianGan = array(7,8,9,10,1,2,3,4,5,6);
		$aYearZhuDizhi = array(9,10,11,12,1,2,3,4,5,6,7,8);
		$yearTianGan = $aYearZhuTianGan[substr($year, -1)];
		$yearDiZhi = $aYearZhuDizhi[$year % 12];
		return array('yearTianGan' => $yearTianGan, 'yearDiZhi' => $yearDiZhi);
	}
	//获取某一年的所有月干支
	/**
	 * 
	 * @param unknown $year
	 * @param string $lunar  true 阴历  false 阳历
	 */
	public static function getMonthsGanZhiByYear($year, $lunar = false){
		$year = (int)$year;
		
		//立春在2月,先取二月的干支
		$aYearZhuTianGan = array(7,8,9,10,1,2,3,4,5,6);
		$yearTianGan = $aYearZhuTianGan[substr($year, -1)];
		
		$aYearFirstMonthTiangan = array(
										1 => 3,
										2 => 5,
										3 => 7,
										4 => 9,
										5 => 1,
										6 => 3,
										7 => 5,
										8 => 7,
										9 => 9,
										10 => 1);
		$monthTianGan = $aYearFirstMonthTiangan[$yearTianGan];
		$monthDiZhi = 3;//自立春日起固定为寅(从立春当天到惊蛰前一天)
		
		$loopTianGan = $monthTianGan;
		$loopDiZhi = $monthDiZhi;
		
		if ($lunar == true) {
			$leapMonth = self::getLeapMonth($year);
			$monthCount = $leapMonth > 0 ? 13 : 12;
			$isLeapSta = 0;
			for ($i = 1; $i<=$monthCount; $i++){
				$month = $i;
				$isleap = 0;
				if($isLeapSta == 1){
					$month = $i - 1;
					$isleap = 1;
					$isLeapSta = 2;
				}elseif ($isLeapSta == 2){
					//闰月后的月份
					$month = $i - 1;
				}

				$aData[] = array('month' => $month, 'isleap' => $isleap, 'tiangan' => $loopTianGan,'dizhi' => $loopDiZhi);
				
				//这里必须放后面
				if(($leapMonth == $i) && ($isLeapSta == 0)){
					$isLeapSta = 1;
				}
				$loopTianGan++;
				$loopTianGan = $loopTianGan == 11 ? 1 : $loopTianGan;
					
				$loopDiZhi++;
				$loopDiZhi = $loopDiZhi == 13 ? 1 : $loopDiZhi;
			}
		}else{
			//1月的干支
			$oneMonthTianGan = $monthTianGan - 1;
			$oneMonthTianGan = $oneMonthTianGan == 0 ? 10 : $oneMonthTianGan;
			$oneMonthDiZhi = 2;
			
			$aData = array();
			$aData[] = array('month' => 1, 'tiangan' => $oneMonthTianGan, 'dizhi' => $oneMonthDiZhi);
			$aData[] = array('month' => 2, 'tiangan' => $monthTianGan, 	  'dizhi' => $monthDiZhi);

			for ($i=3; $i<=12; $i++){
				$loopTianGan++;
				$loopTianGan = $loopTianGan == 11 ? 1 : $loopTianGan;
					
				$loopDiZhi++;
				$loopDiZhi = $loopDiZhi == 13 ? 1 : $loopDiZhi;
				$aData[] = array('month' => $i, 'tiangan' => $loopTianGan, 	  'dizhi' => $loopDiZhi);
			}
		}
		return $aData;
	}
	/**
	 * 获取阳历某月的数据
	 * @param unknown $year
	 * @param unknown $month
	 */
	public static function getSolarMonthData($year, $month){
		//1600-1-1日 星期六 辛酉日
		//阳历月份天数
		$days = self::getMonthDays($month, self::isLeapYear($year));
		
		$startDate = '1600-01-01';//辛酉日
		$startTianGan = 8;
		$startDiZhi = 10;
		$startW = 6;//星期六
		$deffDays = calendarswach::getGapDays($startDate, "$year-$month-01") ;
		
		$aData = array();
		for ($i = 1; $i<= $days; $i++){
			$aLunarDate = self::convertSolarToLunar($year, $month, $i);
			$aLunar = explode('-', $aLunarDate[0]);
			$week = ($startW + $deffDays) % 7;
			
			$dayTianGan = ($startTianGan + $deffDays) % 10;
			if ($dayTianGan == 0) {
				$dayTianGan = 10;
			}
			
			$dayDiZhi = ($startDiZhi + $deffDays) % 12;
			if ($dayDiZhi == 0) {
				$dayDiZhi = 12;
			}
			
			$aTemp = array();
			$aTemp['sd'] = $i;//阳历日期
			$aTemp['ly'] = (int)$aLunar[0];//阴历年
			$aTemp['lm'] = (int)$aLunar[1];//阴历月
			$aTemp['ld'] = (int)$aLunar[2];//阴历日
			$aTemp['leap'] = $aLunarDate[1] ? $aTemp['lm'] : 0;//闰几月
			$aTemp['w'] = $week;//星期几 
			$aTemp['tg'] = $dayTianGan;//天干
			$aTemp['dz'] = $dayDiZhi;//地支
			$aData[] = $aTemp;
			
			$deffDays++;//间隔天数+1
		}
		return $aData;
	}
	/**
	 * 获取阴历某月的数据
	 * @param unknown $year
	 * @param unknown $month
	 */
	public static function getLunarMonthData($year, $month, $leapMonth){
		$month = $leapMonth ? $month +1 : $month;
		$sdate = self::convertLunarToSolar($year, $month, '1');
		$aSolar = explode('-', $sdate);
		$sy = (int)$aSolar[0];
		$sm = (int)$aSolar[1];
		$sd = (int)$aSolar[2];
		
		$startDate = '1600-01-01';//辛酉日
		$startTianGan = 8;
		$startDiZhi = 10;
		$startW = 6;//星期六
		$deffDays = calendarswach::getGapDays($startDate, "$sy-$sm-$sd") ;//阳历相隔天数
		//阴历大月30天
		$monthDays = self::getLunarMonthDays($year, $month);
		$aData = array();
		for ($i=1; $i<=$monthDays; $i++){
			$sdate = self::convertLunarToSolar($year, $month, $i);
			$aSolar = explode('-', $sdate);
			$week = ($startW + $deffDays) % 7;
			
			$dayTianGan = ($startTianGan + $deffDays) % 10;
			if ($dayTianGan == 0) {
				$dayTianGan = 10;
			}
			
			$dayDiZhi = ($startDiZhi + $deffDays) % 12;
			if ($dayDiZhi == 0) {
				$dayDiZhi = 12;
			}
			
			$aTemp = array();
			$aTemp['ld'] = $i;//阴历日期
			$aTemp['sy'] = (int)$aSolar[0];//阳历年
			$aTemp['sm'] = (int)$aSolar[1];//阳历月
			$aTemp['sd'] = (int)$aSolar[2];//阳历日
			$aTemp['leap'] = $leapMonth;//闰几月
			$aTemp['w'] = $week;//星期几
			$aTemp['tg'] = $dayTianGan;//天干
			$aTemp['dz'] = $dayDiZhi;//地支
			$aData[] = $aTemp;
			$deffDays++;//间隔天数+1
		}
		return $aData;
	}
	//获取日 时干支
	public static function getDayHourGanZhis($dayTianGan){
		$aDayFirstHourTiangan = array(
				1 => 1,
				2 => 3,
				3 => 5,
				4 => 7,
				5 => 9,
				6 => 1,
				7 => 3,
				8 => 5,
				9 => 7,
				10 => 9
		);
		$aData = array();
		for ($hour=0;$hour<=23;$hour++){
			$tmpDayTianGan = $dayTianGan;//日天干
			$tempHour = ($hour % 2) == 0 ? $hour + 2 : $hour + 3; //奇数+3 偶数 +2
			$tempHour = $tempHour % 24;
			$hourDiZhi = $tempHour / 2; //每两小时一个时辰
			if ($hourDiZhi == 0) {
				$hourDiZhi = 12;
			}
			
			if ($hour > 22) {////时间计算
				$tmpDayTianGan = ($tmpDayTianGan + 1) % 10;
				$tmpDayTianGan = ($tmpDayTianGan == 0 ) ? 10 : $tmpDayTianGan;
			}
			$dayFirstTianGan = $aDayFirstHourTiangan[$tmpDayTianGan];
			$hourTianGan = ($dayFirstTianGan + ($hourDiZhi - 1)) % 10;
			$hourTianGan = ($hourTianGan == 0 ) ? 10 : $hourTianGan;
			$aTemp = array('h' => $hour, 'tg' => $hourTianGan, 'dz' => $hourDiZhi);
			
			$aData[] = $aTemp;
		}
		return $aData;
	} 
	
}

//$ba = gongliNongli::convertLunarToSolar(1924,1,1);

  

参考资料

[1]如何判断闰月

http://www.cnblogs.com/BpLoveGcy/archive/2010/03/29/1700085.html

[2]闰年知识科普

http://baike.baidu.com/subview/29649/7344239.htm

posted @ 2015-09-26 21:13  huan&ping  阅读(7652)  评论(2编辑  收藏  举报