📄 lunarcalendar.c
字号:
int iBit = 16 - iLunarMonth;
if(iLunarYear < START_YEAR)
return 30L;
if(iLunarMonth > GetLeapMonth(iLunarYear) && GetLeapMonth(iLunarYear))
iBit --;
if(gLunarMonthDay[iLunarYear - START_YEAR] & (1<<iBit))
low ++;
if(iLunarMonth == GetLeapMonth(iLunarYear))
{
if(gLunarMonthDay[iLunarYear - START_YEAR] & (1<< (iBit -1)))
height = 30;
else
height = 29;
}
return MAKELONG(low, height);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//返回阴历iLunarYear年的总天数(1901年1月---2050年12月)
static WORD LunarYearDays(WORD iLunarYear)
{
/*
WORD days=348 ; //12*29
int month = 12 ;
//如果iYear年有闰月,则为13个月
if(gLanarMonth[iYear - START_YEAR])
month ++;
//如果某月是三十天则days++
while(month >=0 && (gLanarMonthDay[iYear - START_YEAR] & (1 << (16 - month))))
{
days ++;
month --;
}
return days;
*/
WORD days =0;
WORD i;
for(i=1; i<=12; i++)
{
LONG tmp = LunarMonthDays(iLunarYear ,i);
days += HIWORD(tmp);
days += LOWORD(tmp);
}
return days;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//计算从1901年1月1日过iSpanDays天后的阴历日期
BYTE CalcLunarDate(WORD *iYear, WORD *iMonth ,WORD *iDay, LONG iSpanDays)
{
//阳历1901年2月19日为阴历1901年正月初一,阳历1901年1月1日到2月19日共有49天
BYTE rcode =0;
LONG tmp;
if(iSpanDays <49)
{
*iYear = START_YEAR-1;
if(iSpanDays <19)
{
*iMonth = 11;
*iDay = 11 + iSpanDays;//WORD(iSpanDays);
}
else
{
*iMonth = 12;
*iDay = iSpanDays -18;//WORD(iSpanDays);
}
return rcode;
}
//下面从阴历1901年正月初一算起计算年
iSpanDays -=49;
*iYear = START_YEAR;
*iMonth = 1;
*iDay = 1;
tmp = LunarYearDays(*iYear);
while(iSpanDays >= tmp)
{
iSpanDays -= tmp;
tmp = LunarYearDays(++(*iYear));
}
//计算月
tmp = LOWORD(LunarMonthDays(*iYear, *iMonth));
while(iSpanDays >= tmp)
{
iSpanDays -= tmp;
if(*iMonth == GetLeapMonth(*iYear))
{
tmp = HIWORD(LunarMonthDays(*iYear, *iMonth));
if(iSpanDays < tmp)
{
rcode = 1;
break;
}
iSpanDays -= tmp;
}
tmp = LOWORD(LunarMonthDays(*iYear, ++(*iMonth)));
}
//计算日
*iDay = *iDay + iSpanDays;//WORD(iSpanDays);
return rcode;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//计算公历iYear年iMonth月iDay日对应的阴历日期,返回对应的阴历节气 0-24(从1901.1.1--2050.12.31)
WORD GetLunarDate(WORD iYear, WORD iMonth, WORD iDay,
WORD *iLunarYear, WORD *iLunarMonth, WORD *iLunarDay)
{
CalcLunarDate(iLunarYear, iLunarMonth, iLunarDay,
CalcDateDiff(iYear, iMonth, iDay, START_YEAR, 1, 1));
return GetLunarHolDay(iYear, iMonth, iDay);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//返回阳历iYear年iMonth月的天数,从1年1月 --- 65535年12月
WORD MonthDays(WORD iYear, WORD iMonth)
{
switch(iMonth)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
return 31;
break;
case 4:case 6:case 9:case 11:
return 30;
break;
case 2:
//如果是闰年
if(IsLeapYear(iYear))
return 29;
else
return 28;
break;
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//计算阳历iYear,iMonth,iDay对应是星期几,从1年1月1日 --- 65535年12月31日
WORD WeekDay(WORD iYear, WORD iMonth, WORD iDay)
{
//数组元素monthday[i]表示第i个月以前的总天数除以7的余数
WORD monthday[]={0,3,3,6,1,4,6,2,5,0,3,5};
WORD iDays = (iYear-1)%7 + (iYear-1)/4 - (iYear-1)/100 +(iYear-1)/400;
iDays += (monthday[iMonth-1] +iDay) ;
//如果iYear是闰年
if(IsLeapYear(iYear) && iMonth>2)
iDays++;
//返回:0,1,2,3,4,5,6表日、一、二、三、四、五、六
return iDays%7;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//检查阴历LunarMonth月,阴历LunarDay日是否为中国民间节日,是返回1否则返回0BOOL DayIsHoliday(WORD LunarYear, WORD LunarMonth, WORD LunarDay, char *buffer){ BOOL res=0;
switch(LunarMonth) { case 1 : if(LunarDay==1)
{
strcpy(buffer, " 今日 春节");
res=1;
}
if(LunarDay==15)
{
strcpy(buffer, " 今日 元宵节");
res=1;
}
break; case 5 : if(LunarDay==5)
{
strcpy(buffer, " 今日 端午节");
res=1;
}
break; case 8 : if(LunarDay==15)
{
strcpy(buffer," 今日 中秋节");
res=1;
}
break;
case 12 : if((LONG)LunarDay==LunarMonthDays(LunarYear, LunarMonth))
{
strcpy(buffer," 今日 除夕");
res=1;
}
} return res;}///////////////////////////////////////////////////////////////////////////////////////////////
//把阴历iYear年格式化成天干记年法表示的字符串
void FormatLunarYear(WORD iYear, char *pBuffer)
{
char szText1[]="甲乙丙丁戊己庚辛壬癸";
char szText2[]="子丑寅卯辰巳午未申酉戌亥";
memcpy(pBuffer, szText1+((iYear-4)%10)*2,2);
memcpy(pBuffer+2,szText2+((iYear-4)%12)*2,2);
strcpy(pBuffer+4,"(");
}
///////////////////////////////////////////////////////////////////////////////////////////////
//把阴历iMonth格式化成中文字符串
void FormatMonth(WORD iMonth, char *pBuffer, BOOL bLunar)
{
char szText[]="正二三四五六七八九十";
if(!bLunar && iMonth==1)
{
strcpy(pBuffer, "一月");
return;
}
if(iMonth<=10)
{
memcpy(pBuffer, szText + (iMonth -1)*2, 2);
strcpy(pBuffer+2 , "月");
return;
}
if (iMonth == 11)
strcpy(pBuffer, "十一");
else
strcpy(pBuffer, "十二");
strcpy(pBuffer+4 , "月");
}
///////////////////////////////////////////////////////////////////////////////////////////////
//把阴历iDay格式化成中文字符串
void FormatLunarDay(WORD iDay, char *pBuffer)
{
char szText1[]="初十廿三";
char szText2[]="一二三四五六七八九十";
if(iDay != 20 && iDay !=30)
{
memcpy(pBuffer, szText1 + (iDay-1)/10*2 ,2);
memcpy(pBuffer+2, szText2 + ((iDay-1)%10)*2 ,2);
pBuffer[4]='\0';
}
else
{
if(iDay == 20)
strcpy(pBuffer, "二");
else
memcpy(pBuffer, szText1 + iDay/10*2, 2);
strcpy(pBuffer+2, szText2 +18);
}}
///////////////////////////////////////////////////////////////////////////////////////////////
//根据GetLunarDate()函数返回的节气信息得到中文节气表示字符串
void PaintChineseInfo(char *pBuffer, WORD iHolDay)
{
char text[18];
char *HolText[] ={"小寒", "大寒", "立春", "雨水",
"惊蛰", "春分", "清明", "谷雨",
"立夏", "小满", "芒种", "夏至",
"小暑", "大暑", "立秋", "处暑",
"白露", "秋分", "寒露", "霜降",
"立冬", "小雪", "大雪", "冬至"};
if(iHolDay)
{
strcpy(text, " 今日 ");
strcat(text, HolText[iHolDay-1]);
strcpy(pBuffer, text);
}
else
strcpy(pBuffer, "");
}
///////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -