📄 calendarconvert.cpp
字号:
//获取农历月的天数
int CCalendarConvert::GetNongMonthDays(int year, int month)
{
int days = NongMonthIsLarge(year, month) ? 30:29;
return days;
}
//获取农历月的天数
int CCalendarConvert::GetNongMonthDays(int year, int month, BOOL m_run)
{
int days = 0;
if(m_run)
days = GetNongRunYueDays(year);
else
days = GetNongMonthDays(year,month);
return days;
}
//获取公历年的天数
int CCalendarConvert::GetGongYearDays(int year)
{
int days = YearIsRunNian(year)?366:365;
return days;
}
//获取农历年的天数
int CCalendarConvert::GetNongYearDays(int year)
{
int days=0;
for(int i = 1; i < 13; i++)
days += GetNongMonthDays(year,i);
days += GetNongRunYueDays(year);
return days;
}
//获取农历年闰月天数
int CCalendarConvert::GetNongRunYueDays(int year)
{
if(GetNongRunYue(year)==0)
return 0;
int days=RunYueIsLarge(year)?30:29;
return days;
}
//获取农历闰月
int CCalendarConvert::GetNongRunYue(int year)
{
return (CalendarData[year-m_minyear][2] & 0x0f);
}
//公历日期到元旦的天数
int CCalendarConvert::DaysFromNewYear(CALENDAR m_day)
{
int days=0;
for(int i=1;i<m_day.month;i++)
days+=GetGongMonthDays(m_day.year,i);
days+=m_day.day;
return days;
}
//农历日期到春节的天数
int CCalendarConvert::DaysFromSpringDay(CALENDAR m_day)
{
int days=0;
int month=GetNongRunYue(m_day.year);//处理闰月
if(month<m_day.month) //闰月小于日期月份
days+=GetNongRunYueDays(m_day.year);
else
{
if((month==m_day.month) && m_day.isrunyue)//日期月份是闰月
days+=GetNongRunYueDays(m_day.year);
}
for(int i=1;i<m_day.month;i++)
days+=GetNongMonthDays(m_day.year,i);
days += m_day.day;
return days;
}
//公历年是否闰年
BOOL CCalendarConvert::YearIsRunNian(int year)
{
return (CalendarData[year-m_minyear][0] & 0x80);
}
//判断闰月是否为大月
BOOL CCalendarConvert::RunYueIsLarge(int year)
{
return (CalendarData[year-m_minyear][0]&0x40);
}
//计算2的N次方
int CCalendarConvert::Cal2N(int n)
{
int ret=1;
for(int i=0; i < n; i++)
ret *= 2;
return ret;
}
//判断农历年的月份是否为大月
BOOL CCalendarConvert::NongMonthIsLarge(int year,int month)
{
BOOL ret=FALSE;
if(month<9)
{
if(CalendarData[year-m_minyear][1] & Cal2N(8-month))
ret=TRUE;
}
else
{
unsigned char ch=Cal2N(12-month);
ch<<=4;
if(CalendarData[year-m_minyear][2] & ch)
ret=TRUE;
}
return ret;
}
//判断公历月份是否为大月(二月除外)
BOOL CCalendarConvert::GongMonthIsLarge(int month)
{
BOOL ret = FALSE;
if(month < 8)
{
if(month%2)
ret = TRUE;
}
else
{
if(!(month%2))
ret = TRUE;
}
return ret;
}
//农历大年初一到元旦的天数
int CCalendarConvert::GetDaysFromStart(int year)
{
return (CalendarData[year-m_minyear][0]&0x3f);
}
/*********暂时没有用到的成员函数***********/
//判断是否是闰月
BOOL CCalendarConvert::MonthIsRunYue(int year,int month)
{
return (month == GetNongRunYue(year));
}
//获取公历两个日期之间的天数
int CCalendarConvert::GetGongDays(CALENDAR m_start,CALENDAR m_end)
{
int days=0;
for(int i=m_start.year;i<m_end.year;i++)
days+=GetGongYearDays(i);
days-=DaysFromNewYear(m_start);
days+=DaysFromNewYear(m_end);
return days;
}
//获取农历两个日期之间的天数
int CCalendarConvert::GetNongDays(CALENDAR m_start,CALENDAR m_end)
{
int days=0;
for(int i=m_start.year;i<m_end.year;i++)
days += GetNongYearDays(i);
days -= DaysFromSpringDay(m_start);
days += DaysFromSpringDay(m_end);
return days;
}
//将当前公历日期合成为结构
CALENDAR CCalendarConvert::GetCurGongDate()
{
CALENDAR m_cal;
SYSTEMTIME m_time;
GetLocalTime(&m_time);
m_cal.year = (int)m_time.wYear;
m_cal.month= (int)m_time.wMonth;
m_cal.day = (int)m_time.wDay;
m_cal.week = (int)m_time.wDayOfWeek;
return m_cal;
}
//比较两个日期的大小
int CCalendarConvert::CompareTwoDate(CALENDAR m_fir,CALENDAR m_sec)
{
int m_state=0;
if(m_fir.year>m_sec.year)
m_state=1;
else
{
if(m_fir.year<m_sec.year)
m_state=-1;
else
{
if(m_fir.month>m_sec.month)
m_state=1;
else
{
if(m_fir.month<m_sec.month)
m_state=-1;
else
{
if(m_fir.day>m_sec.day)
m_state=1;
else
{
if(m_fir.day<m_sec.day)
m_state=-1;
else
m_state=0;
}
}
}
}
}
return m_state;
}
//获取60年中的第N年的天干地支名称
CString CCalendarConvert::GetNNameIn60(int index)
{
char ShengXiao[25] = "鼠牛虎兔龙蛇马羊猴鸡狗猪";
char TianGan[21] = "甲乙丙丁戊己庚辛壬癸";
char DiZhi[25] = "子丑寅卯辰巳午未申酉戌亥";
char buffer[20];
memset(buffer, 0, 20);
strcpy(buffer, "农历");
int m_cur = 0, m_this = 0;
int tian = 0, di = 0;
for(int i = 0; i < 60; i++)
{
tian = i%10;
di = i%12;
if(m_this == index)
{
strncpy(&buffer[4], &TianGan[tian*2], 2);
strncpy(&buffer[6], &DiZhi[di*2], 2);
strcat(buffer, "年,");
strncpy(&buffer[12], &ShengXiao[di*2], 2);
strcat(buffer, "年");
}
m_this++;
}
return CString(buffer);
}
//获取农历年份的干支名称
CString CCalendarConvert::GetGanZhi(int m_nongyear)
{
int m_index=(m_nongyear-1924)%60;
return GetNNameIn60(m_index);
}
//将农历年的月份注入组合框
void CCalendarConvert::NongMonthToList(int m_nongyear, CComboBox & m_list)
{
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -