我们在编制应用软件时会遇到要使用日历类特性的时候,特别是需显示农历日期的一些元素。
网上有好多关于星期的算法,我对比各种算法,最终认为基姆拉尔森公式是最简单简洁的算法。
本文提供二种最简单简洁的星期算法的C语言应用方法。
一是上述的基姆拉尔森公式法,另一是按日序列计算的方法,也可称为积日法。
完整的万年历程序制作可参阅我在本站的博文“简明万年历编制(C语言)”。该文中有农历纪年算法和公历农历对照万年历软件界面输出方法。
下面是简单的 C 语言代码:
变量
int dy, dm, dd;
int dw;
string wds;
String wdss="星期日星期一星期二星期三星期四星期五星期六";
Input Date >>> dy, dm, dd >>> 计算
cal_weekday (){
//** 计算星期几
int ty, tm;
clearOutput ();
ty=dy;
tm=dm;
if (dm<3){
ty=dy-1;
tm=dm+12; }
//iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)
//mod 7 基姆拉尔森公式法
//打印月历,月首日 dd=1,计算当前日,dd=日历日
alln=dd+2*tm+3*(tm+1)/5+ty+(int)(ty/4);
alln=alln-(int)(ty/100)+(int)(ty/400)+1;
wd=alln-alln/7*7; //mod (alln,7)
wds=subString(wdss,wd*3,3);
dm2=intToString (dm);
if (dm<10) dm2="0"+intToString (dm);
dd2=intToString (dd);
if (dd<10) dd2="0"+intToString (dd);
print "InputDate = ",dy ,"-",dm2,"-",dd2
print " ";
print "总天数 = ",alln ;
print "计算星期 >>> " , wds ;
print " ";
//** 积日法
//** 1900年01月01日起算计算总天数
//** 1900-01-01 >>> 星期一
string yds; //本年日历天
string ydds; //本年日历天
double tms;
yds="000031059090120151181212243273304334";
ydds=subString(yds,(dm-1)*3,3);
//** 先计算年前天数,再计算上月末到年首天数,再加上本月天数
//因只计算1900年后日历天数,省略百年闰计算
tms=stringToDouble(ydds);
alln1=(dy-1900-1)*365+((dy-1900-1)/4)+1
alln1=alln1+(int)(tms);
if ((dy-dy/4*4)==0&&dm>2)alln1=alln1+1;
alln1=alln1+dd ;
wd=alln1-alln1/7*7; //mod (alln1, 7)
wds=subString(wdss,wd*3,3);
print "总天数 = ", alln1 ;
print "计算星期 >>> " , wds ;
// return weekday >>> wds $
}//cal_weekday ()