📄 calendar.cpp
字号:
#include "defines.h"
#include "Calendar.h"
#include "EEprom.h"
#if SUPPORT_LUNAR
//计算农历
UCHAR CCalendar::GetLunar(UCHAR &lunarMon,
UCHAR &lunarDay,
#if SUPPORT_LUNAR_HOLIDAY
UCHAR &LunarHoliday,
#endif
UCHAR year,
UCHAR mon,
UCHAR day)
{
//农历1999年1月1日是公历1999年2月16日, 距公历2000年1月1日319天
USHORT days = Datediff(year, mon, day) + 319;
UCHAR x, y;
UCHAR lunarMonth;//这年闰哪个月
UCHAR monthDays; //当前这个月多少天
USHORT lunarMonthDays;
//每一个农历年
for(y = 0; y < sizeof(gLunarMonthDays)/sizeof(gLunarMonthDays[0]); y++){
lunarMon = 1;
//lunarMonthDays = gLunarMonthDays[y];
//lunarMonth = gLunarMonth[y>>1];
CEEprom::Read(lunarMonthDays, LUNARMONTHDAYS_ADDR + (y<<1));
lunarMonth = CEEprom::Read(LUNARMONTH_ADDR + (y>>1));
if(y & 1) lunarMonth &= 0x0f;
else lunarMonth >>= 4;
for(x = 1; x <= (lunarMonth ? 13 : 12); x++){
monthDays = (lunarMonthDays & 0x8000) ? 30 : 29;
if(days <= monthDays){
lunarDay = (UCHAR)days;
if(lunarMonth == lunarMon) lunarMon |= 0xf0;
#if SUPPORT_LUNAR_HOLIDAY
//UCHAR temp = gLunarHoliday[year * 12 + mon-1];
USHORT addr = LUNARHOLIDAY_ADDR + year * 12 + mon-1;
UCHAR temp = CEEprom::Read(addr);
if(day > 15 ){
LunarHoliday = temp & 0x0f;
LunarHoliday += 15;
}else{
LunarHoliday = temp >> 4;
LunarHoliday = 15 - LunarHoliday;
}
if(LunarHoliday < day){//当前节气已经过去
if(day > 15){
//temp = gLunarHoliday[year * 12 + mon];
temp = CEEprom::Read(addr+1);
LunarHoliday = temp >> 4;
LunarHoliday = 15 - LunarHoliday;
LunarHoliday += GetMonthDays(year, mon);
temp = LunarHoliday - day;
if(mon == 12) LunarHoliday = 1;
else LunarHoliday = (mon << 1) +1;
}else{
LunarHoliday = temp & 0x0f;
LunarHoliday += 15;
temp = LunarHoliday - day;
LunarHoliday = (mon - 1) << 1;
LunarHoliday++;
LunarHoliday++;
}
}else{
temp = LunarHoliday - day;
LunarHoliday = ((mon - 1) << 1) + 1;
if(day > 15) LunarHoliday++;
}
//按照传统习惯,立春是第一个节气,因此,减2
if(LunarHoliday > 2) LunarHoliday -= 2;
else LunarHoliday += 22;
return temp;
//闰年: lunarYear = x-1; if(lunar > 99) lunarYear = 99;
#else
return 0;
#endif
}
days -= monthDays;
lunarMonthDays <<= 1;
if(x != lunarMonth) lunarMon++;
}
}
return 0;
}
// 2000年1月1日已经过去多少天了
USHORT CCalendar::Datediff(UCHAR year, UCHAR mon, UCHAR day)
{
static const USHORT Yeardays[] = {0, 366, 366+365, 366+365*2};
static const USHORT Monthdays[]={0, 31, 59 ,90, 120, 151, 181, 212, 243, 273, 304, 334};
// 31 28 31 30 31 30 31 31 30 31 30
USHORT days = (year>>2) * (366+365*3) + Yeardays[year & 3] + Monthdays[mon-1] + day;
if(!(year & 3) && mon > 2) days++;
// 2000年1月1日已经过去多少天了需要修正
// days += year / 400 - year / 100;
return days;
}
#endif
//计算星期
UCHAR CCalendar::GetWeekday(UCHAR year, UCHAR mon, UCHAR day)
{
static const UCHAR Weekdays[] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
// 31 28 31 30 31 30 31 31 30 31 30
return (6-1 + (year>>2) + year + Weekdays[mon-1] + day + (((year & 3) || mon > 2)? 1 : 0)) % 7;
//完整的计算星期的公式:
//(year>>2) - (year / 100) + (year/400) + year +
// Weekdays[mon-1] + day + ((!isLeap(year) || mon > 2)? 1 : 0)) % 7;
}
UCHAR CCalendar::GetMonthDays(UCHAR year, UCHAR month)
{
if((month < 8 && (month & 1)) || (month > 7 && !(month & 1))) return 31;
if(month == 4 || month == 6 || month == 9 || month == 11) return 30;
if(year & 3) return 28; //嘿嘿,2000-2099年的闰年判断简单算法
return 29;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -