行事曆檢核副程式
本文在提供一個計算當日在行事曆內是星期幾的副程式。
程式碼如下:
//***** 行事曆, 檢查當日的星期幾, 0代表星期日, 其他依序
//***** Mth[13]矩陣佈的數據, 第一個是年代表(未2位),次後依一月~十二月,所設定之數據是前一個月最後一天的星期數
//***** 只要呼叫本副程式,即依當下的 AC_yer,AC_mth,AC_day值,計算出本日的星期幾存於AC_wek中
void CHECK_year(void)
{ unsigned char i;
unsigned char Mth[13]={20,2,5,6,2,4,0,2,5,1,3,0,1}; //2020行事曆矩陣(本年度有閏日)
// unsigned char Mth[13]={21,4,0,0,3,5,1,3,6,2,4,0,2}; //2021行事曆矩陣
if((AC_mth==4 || AC_mth==6 || AC_mth==9 || AC_mth==11) && AC_day>=31) {AC_day=1;AC_mth++;goto C0;} //判斷當月只有30天的月份
else { if(AC_mth==2 && AC_day>=29 && (AC_yer%4)!=0) {AC_day=1;AC_mth++;goto C0;} //判斷當年2月只有28天的月份
else { if(AC_mth==2 && AC_day>=30 && (AC_yer%4)==0) {AC_day=1;AC_mth++;goto C0;} //判斷當年2月只有29天的月份
else { if((AC_mth==1 || AC_mth==3 || AC_mth==5 || AC_mth==7 || AC_mth==8 || AC_mth==10 || AC_mth==12) && AC_day>=32)
{ AC_day=1;AC_mth++;goto C0;}
else { goto C1; }
}
}
}
C0:
if(AC_mth>=13) // 每年需更新每個月的第一天是星期幾在矩陣變數 Mth[AC_mth]
{ AC_yer++;AC_mth=1;
Mth[0]=AC_yer;
if((AC_yer-1)%4==0) Mth[1]=Mth[1]+2; //判斷去前一年一月是否為閏年
else Mth[1]++;
if(Mth[1]>7) { Mth[1]=Mth[1]%7; }
if((AC_yer-1)%4==0) Mth[2]=Mth[2]+2; //判斷去前一年一月是否為閏年
else Mth[2]++;
if(Mth[2]>7) { Mth[2]=Mth[2]%7; }
for(i=3;i<13;i++)
{ if((AC_yer%4)==0) Mth[i]=Mth[i]+2; //判斷今年三月~12月是否為閏年
else Mth[i]=Mth[i]+1;
if(Mth[i]>7) { Mth[i]=Mth[i]%7; }
}
}
C1:
AC_wek=(Mth[AC_mth]+AC_day)%7; //計算本日屬於星期幾
if(AC_wek==0) AC_wek=7;
return;
}