日历查询农历查询 日历农历阳历表对照表
在国内,有许多民间习俗、节日都与农历有关。对于想要了解农历的人来说,一个真实可信的日历农历阳历表对照表是必不可少的工具。接下来,我们就来深入了解一下日历农历阳历表对照表。
一、日历与农历的区别
日历和农历最大的不同在于计算方式不同。日历采用太阳日为基础,每年365天,一年中四季分明,特点是平稳稳定,对于固定的时刻和日期有很高的准确性,常见的阳历就是采用日历计算的。
而农历则是按照农时变化来计算的,历法建立在月球运动为基础上。一年中的月亮圆缺阴晴不定,因此农历每年的天数不同,并且不像日历一样有固定的大小月。农历的四季划分并不严密,但是对于一些民间习俗和节日的庆祝有着重要的意义。以为例,春节、中秋节、元宵节等都是农历节日。
二、阳历和农历的转换
由于阳历与农历计算方式不同,因此两者之间要进行转换就需要掌握一些转换方法。
1.阳历转农历:
设阳历年、月、日为:Y、M、D
一、计算阳历年距离1900年的天数。
1901(年)——1950(年)=49(年)
365×49+12=18,979(天)
1950年1月1日————1900年1月1日=365+365+365+365+366
=1826(天)
18,979+1,826-1=20,804(天)
二、计算年码
(Y-1900)%12+1
三、计算闰年数
int k;
k=(Y-1900)/4;
k=k-(Y-1900)/100;
k=k+(Y-1900)/400;
if((Y%4==0&&Y%100!=0)||Y%400==0&&M>2) k++;
else k=k;
即:k=(闰年数),也有说法k=负闰数)
四、计算该日之前passedDays
passedDays=365*(Y-1900)+k+(int)(30.6*(M+1))+D-62;
1月和2月要当成上一年的13月和14月,得:
if(M<3) passedDays=passedDays+1;
五、计算该日对应的阴历日期
int total,k,rn,i;
total=passedDays; /*1900-1-31是阴历1900年正月初一*/
rn=1; /*阴历月天数还是初始为大月*/
for (i=1900;i<=2100 && total>0;i++)
{
k=chineseCalendarData[i-1900];/*农历每一年的天数,区分大小月*/
r=nDaysOfYear(type,i);/*阳历每个月的天数*/
total=total-(k+(r?29:30));/*累减每一年的天数*/
rn++;
}
if (total<0)
total+=k+(r?29:30);
rn--;
return(rn*100+passedDays+29);
2.农历转阳历:
农历转阳历需要用到以下字符串数组:
char *stZodiac[]={"344270255","345244256","345255227","346265225","345255246","346227245","344277241",
"347256200","345244247","346225260","345205255","346213253"};
char *stName[]={"","347224265","344275240","350262215","345246267","345231250","346205252",
"347220206","346224235","346227245","344277241","345265266","346231242"};
int aSpecialMonth[]={0,2,5,8,10,13};
其中"stZodiac[]"为十二生肖,"stName[]"为中文数字(一到十二),"aSpecialMonth[]"为十二个月中有闰月的月份。
附上农历转阳历代码:
void GetUpOffset(int &nTheDate)
int nOffset;
if (GetBit(nTheDate, 22) != 0)
nOffset = 0;
for (int i = 21; i >= 0; i--)
if (GetBit(nTheDate, i) != 0)
nOffset += aMonthAdd[i];
if (aLeapMonth[GetBit(nTheDate, 23) - 1] != 0 && GetBit(nTheDate, 22) != 0)
nOffset -= aMonthAdd[aLeapMonth[GetBit(nTheDate, 23) - 1] - 1];
nOffset += aMonthAdd[12];
else
for (int i = 20; i >= 0; i--)
if (aLeapMonth[GetBit(nTheDate, 21) - 1] != 0 && GetBit(nTheDate, 21) != 0)
nOffset -= aMonthAdd[aLeapMonth[GetBit(nTheDate, 21) - 1] - 1];
nTheDate = nOffset + GetBit(nTheDate, 9) + 29;
int CCalendar::Lunar2SolarIndex( long dwLunarData )
int Year, Month, Day;
int LeapMonth = GetLeapMonth(dwLunarData);
int DayCount = GetBitInt(dwLunarData, 17, 5);
int BitMonth = GetBitInt(dwLunarData, 12, 4);
int BitDay = GetBitInt(dwLunarData, 7, 5);
int IsLeap = false;
if (LeapMonth > 0)
if (BitMonth >= LeapMonth)
Month = BitMonth + 1;
Month = BitMonth;
if (Month == 12)
Month = 1;
if (Month <= LeapMonth)
Year = GetBitInt(dwLunarData, 9, 4);
if (Year <= BitMonth)
Year--;
IsLeap = (BitMonth == LeapMonth);
Day = DayAdd[Year - MIN_YEAR] + GetBitInt(dwLunarData, 0, 7) - 1;
auto solarAns = Lunar2Solar(Year, Month, Day, IsLeap);
return solarAns.nDayIndex;
三、结语
在日常生活中,阳历日历还是更加受到人们的喜爱和使用。但是,对于一些民间节日、重要活动的举办等,农历日历占据着不可替代的地位。因此,了解日历农历阳历表对照表的转换方法,对于我们更好地了解民俗文化,也有非常重要的帮助作用。