|
蔡勒(Zeller)公式:是一個(gè)計(jì)算星期的公式。
隨便給一個(gè)日期,就能用這個(gè)公式推算出是星期幾。
蔡勒公式如下:
W = [ C/4 ] - 2C + y + [ y/4 ] + [ 13 * (M + 1) / 5] + d -1
公式中的符號(hào)含義如下:
W: 星期; w對(duì)7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六
C: 世紀(jì)-1(前兩位數(shù))
y: 年(后兩位數(shù))
m: 月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月來計(jì)算,比如2003年1月1日要看作2002年的13月1日來計(jì)算)
d: 日
[ ]代表取整,即只要整數(shù)部分。
下面以中華人民共和國成立100周年紀(jì)念日那天(2049年10月1日)來計(jì)算是星期幾,過程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1
=49+[12.25]+5-40+[28.6]
=49+12+5-40+28
=54 (除以7余5)
即2049年10月1日(100周年國慶)是星期五。
再比如計(jì)算2006年4月4日,過程如下:
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
=6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1
=-12 (除以7余2,注意對(duì)負(fù)數(shù)的取模運(yùn)算!)
不過,以上的公式都只適合于1582年(我國明朝萬歷十年)10月15日之后的情形。羅馬教皇格里高利十三世在1582年組織了一批天文學(xué)家,根據(jù)哥白尼日心說計(jì)算出來的數(shù)據(jù),對(duì)儒略歷作了修改。將1582年10月5日到14日之間的10天宣布撤銷,繼10月4日之后為10月15日。后來人們將這一新的歷法稱為“格里高利歷”,也就是今天世界上所通用的歷法,簡稱格里歷或公歷。
程序一:
// 計(jì)算2000~2099年任一天星期幾
// year : 00-99
// month: 01-12
// day : 01-31
unsigned char GetWeekFromDay(unsigned char year,unsigned char month,unsigned char day)
{
if( month == 1 || month == 2 )
{
month += 12;
if( year > 0 )
year--;
else
year = 4;
}
// 返回星期幾(星期一用1表示,而星期天用7表示)
return 1+(( day + 2*month + 3*(month+1)/5 + year + year/4 ) %7);
}
程序二:這個(gè)算法效率比一高好多。。。。
//論空間還是時(shí)間,另外,擴(kuò)展個(gè)幾千年也很容易。
//51的話,可以定義在CODE,不光省RAM,還節(jié)省代碼空間(少一條MOV指令)。
uchar WeekData[]={0,3,3,6,1,4,6,2,5,0,3,5};
/*2000-2099*/
unsigned char GetWeekDay(unsigned char year,unsigned char month,unsigned char day)
{
return ((6+WeekData[month-1]+year+day+year/4)%7);
}
這里0代表星期天,使用者應(yīng)該加上日前限定的功能。
學(xué)習(xí)之。
|
|