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

📄 calendar.cpp

📁 c语言源玛,扫描的游戏代码,攻大家看.多体意见
💻 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 + -