日历类星期的算法

我们在编制应用软件时会遇到要使用日历类特性的时候,特别是需显示农历日期的一些元素。

网上有好多关于星期的算法,我对比各种算法,最终认为基姆拉尔森公式是最简单简洁的算法。

本文提供二种最简单简洁的星期算法的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 ()

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值