📄 ymdlunar.c
字号:
return ( WORD )bLeapThisYear ;
}
// ********************************************************************
//声明:WORD Lunar_GetDaysOfMonth( WORD wYear, WORD wMonth, BOOL bLeap )
//参数:
// IN wYear - 给定的农历年
// IN wMonth - 给定的农历月
// IN bLeap - 给定的这个月是否为润月(第2个月)
//返回值:
// 得到该年月的天数
//功能描述:得到该年月的天数
//引用:
// ********************************************************************
WORD Lunar_GetDaysOfMonth( WORD wYear, WORD wMonth, BOOL bLeap )
{
WORD wYearDays ; // store data from array
WORD wLeapMonth ;
WORD wMonthIndex ;// 1 ~ 12 or 1 ~ 13 if the year have leap month
if( ( wYear > LUNAR_YEAR_MAX )||( wYear < LUNAR_YEAR_MIN ) )
return 0 ;
wYearDays = g_LunarMonthDay[ wYear - LUNAR_YEAR_MIN ] ;
wLeapMonth = Lunar_GetLeapMonth( wYear ) ;
if( ( ( wLeapMonth == wMonth )&&( bLeap == TRUE ) )||
( ( wLeapMonth > 0 )&&( wMonth > wLeapMonth ) ) )
wMonthIndex = wMonth + 1 ;
else
wMonthIndex = wMonth ;
wMonthIndex = 0x8000 >> ( wMonthIndex - 1 ) ;
if( wMonthIndex&wYearDays )
return 30 ;
else
return 29 ;
}
// ********************************************************************
//声明:BOOL Lunar_GetYMDFromAD( WORD wYear, WORD wMonth, WORD wDay, WORD *pwLYear, WORD *pwLMonth, WORD *pwLDay, BOOL *pbLeap )
//参数:
// IN wYear - 给定的公历年
// IN wMonth - 给定的公历月
// IN wDay - 给定的公历日
// IN pwLYear - 计算得到的农历年
// IN pwLMonth - 计算得到的农历月
// IN pwLDay - 计算得到的农历日
// IN pbLeap - 计算得到的是否农历润月
//返回值:
// TRUE表示计算成功
//功能描述:根据公历年月日,计算出对应的农历年月日,及是否农历润月
//引用:
// ********************************************************************
BOOL Lunar_GetYMDFromAD( WORD wYear, WORD wMonth, WORD wDay, WORD *pwLYear, WORD *pwLMonth, WORD *pwLDay, BOOL *pbLeap )
{
WORD wAllDays=0 ;
WORD wLunarYear, wLunarMonth, wLunarDays, wLunarMonthDays ;
WORD i;
if( ( wYear > LUNAR_YEAR_MAX )||( wYear < LUNAR_YEAR_MIN ) )
return FALSE ;
// Get the days from LUNAR_YEAR_MIN to wYear, but exclude wYear
for( i = LUNAR_YEAR_MIN ; i < wYear ; i ++ )
{
wAllDays+=IsLeap( ( short ) i )? 366 : 365 ;
}
// Get the Days from Jannary to wMonth,but exclude wMonth
for( i = 1 ; i < wMonth; i ++ )
{
wAllDays += GetDayofTheMonth( wYear, i );
}
// Get the days of the wDay ;
wAllDays += wDay ;
wAllDays -= 49;// 49 = sun calendar days - lunar calendar days ;
wLunarYear = Lunar_GetYearByDays( wAllDays, &wLunarDays );
wLunarMonth = Lunar_GetMonthByDays( wLunarYear, wLunarDays,&wLunarMonthDays,pbLeap );
*pwLYear = wLunarYear ;
*pwLMonth = wLunarMonth ;
*pwLDay = wLunarMonthDays ;
return TRUE ;
}
// ********************************************************************
//声明:BOOL Lunar_GetYMDsFromADMonth( WORD wYear, WORD wMonth, WORD wDaysOfMonth, WORD arrLunarYMD[][3] )
//参数:
// IN wYear - 给定的公历年
// IN wMonth - 给定的公历月
// IN wDaysOfMonth - 给定的公历月中的天数
// IN arrLunarYMD - 计算得到的农历年月日的数组
//返回值:
// TRUE表示计算成功
//功能描述:根据公历年月和这个月的天数,计算出在该公历年月对应的农历年月日
//引用:
// ********************************************************************
BOOL Lunar_GetYMDsFromADMonth( WORD wYear, WORD wMonth, WORD wDaysOfMonth, WORD arrLunarYMD[][3] )
{
BOOL bLeap;
WORD wDay;
if( wDaysOfMonth==0 )
{
wDaysOfMonth = GetDayofTheMonth( wYear, wMonth );
}
for( wDay=1; wDay<=wDaysOfMonth; wDay++ )
{
if( !Lunar_GetYMDFromAD( wYear, wMonth, wDay, &arrLunarYMD[wDay][0],
&arrLunarYMD[wDay][1], &arrLunarYMD[wDay][2], &bLeap ) )
{
return FALSE;
}
}
return TRUE;
}
//===========================================
static const TCHAR c1[][3] =
{ "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };
static const TCHAR c2[][3] =
{ "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };
// ********************************************************************
//声明:void Lunar_GetNameYear( WORD wYear, LPTSTR pszTemp )
//参数:
// IN wYear - 给定的农历年
// IN pszTemp - 计算得到的农历年的甲子String
//返回值:
// 无
//功能描述:得到该年的甲子表示
//引用:
// ********************************************************************
void Lunar_GetNameYear( WORD wYear, LPTSTR pszTemp )
{
int x, y, ya ;
ya = wYear+8;
if( ya < 1 )
{
ya = ya + 1;
}
if( ya < 12 )
{
ya = ya + 60;
}
x = ( ya + 8 - ( ( ya + 7 ) / 10 ) * 10 )%10;
y = ( ya - ( ( ya-1 ) / 12 ) * 12 )%12;
strcpy( pszTemp, c1[x] );
strcat( pszTemp, c2[y] );
}
// ********************************************************************
//声明:void Lunar_GetNameMonth( WORD wMonth, LPTSTR pszTemp )
//参数:
// IN wMonth - 给定的农历月
// IN pszTemp - 计算得到的农历月的中文编号表示String
//返回值:
// 无
//功能描述:得到该月的中文编号表示(“正、二、三、... 十、冬、腊”)
//引用:
// ********************************************************************
void Lunar_GetNameMonth( WORD wMonth, LPTSTR pszTemp )
{
ASSERT( wMonth<=ARR_COUNT(szMonths) );
sprintf( pszTemp,"%s月",szMonths[wMonth-1] ) ;
}
// ********************************************************************
//声明:void Lunar_GetNameDay( WORD wMonth, WORD wDay, LPTSTR pszTemp )
//参数:
// IN wMonth - 给定的农历月
// IN wDay - 给定的农历日
// IN pszTemp - 计算得到的农历日的中文编号表示String
//返回值:
// 无
//功能描述:得到该月指定日的中文编号表示(“初一 ... 十五 ... 三十”)
//引用:
// ********************************************************************
void Lunar_GetNameDay( WORD wMonth, WORD wDay, LPTSTR pszTemp )
{
if( !wMonth && (wDay == 1) )
{
sprintf( pszTemp,"%s月",szMonths[wMonth-1] ) ;
}
else
{
ASSERT( wDay<=ARR_COUNT(szDays) );
strcpy( pszTemp, szDays[wDay-1] );
}
}
// ********************************************************************
//声明:void Lunar_GetNameYMD( WORD wYear, WORD wMonth, WORD wDay, LPTSTR pszTemp )
//参数:
// IN wYear - 给定的农历年
// IN wMonth - 给定的农历月
// IN wDay - 给定的农历日
// IN pszTemp - 计算得到的农历年月日的中文编号表示String
//返回值:
// 无
//功能描述:得到该年月日的中文编号表示(“甲子年 正月 初一”)
//引用:
// ********************************************************************
void Lunar_GetNameYMD( WORD wYear, WORD wMonth, WORD wDay, LPTSTR pszTemp )
{
TCHAR pszYear[12];
ASSERT( wMonth<=ARR_COUNT(szMonths) );
ASSERT( wDay<=ARR_COUNT(szDays) );
Lunar_GetNameYear( wYear, pszYear );
sprintf( pszTemp,"%s年 %s月 %s", pszYear, szMonths[wMonth-1], szDays[wDay-1] );
}
// ********************************************************************
//声明:void Lunar_GetYearRange( WORD* pwYearMin, WORD* pwYearMax )
//参数:
// IN pwYearMin - 保存最低年
// IN pwYearMax - 保存最高年
//返回值:
// 无
//功能描述:获取该农历算法的年范围
//引用:
// ********************************************************************
void Lunar_GetYearRange( WORD* pwYearMin, WORD* pwYearMax )
{
*pwYearMin = LUNAR_YEAR_MIN;
*pwYearMax = LUNAR_YEAR_MAX;
}
// ********************************************************************
//声明:BOOL Lunar_CheckYear( WORD wYear )
//参数:
// IN wYear - 待检查的年
//返回值:
// TRUE表示在该范围内
//功能描述:检查wYear年,是否在该农历算法的年范围内
//引用:
// ********************************************************************
BOOL Lunar_CheckYear( WORD wYear )
{
if( wYear>=LUNAR_YEAR_MIN && wYear<=LUNAR_YEAR_MAX )
{
return TRUE;
}
else
{
return FALSE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -