⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lunarcalendar.c

📁 一个linux下的时钟软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -