原创 1904---9999年星期简洁算法

2009-4-16 14:10 2457 15 15 分类: MCU/ 嵌入式
星期的计算方法,没有经过全面的比较,只使用过第一种方法。
第一种方法:仅限于1901-2099
void GetWeek(unsigned int year,
             unsigned char month,
             unsigned char day,
             unsigned char *p)
{   
    unsigned int temp2;
    unsigned char yearH,yearL;
   
    yearH=year/100;    yearL=year%100;
   
    /* 如果为21世纪,年份数加100 */
    if (yearH>19)         yearL+=100;
    /* 所过闰年数只算1900年之后的 */
    temp2=yearL+yearL/4;
    temp2=temp2%7;
    temp2=temp2+day+table_week[month-1];
    if (yearL%4==0&&month<3)    temp2--;
    *p=(temp2%7);
}

第二种方法:
int week(int cc,int yy,int mm,int dd)   //世纪,年份,月份,日期 



    if (++mm<4)

    {

      mm+=4;

      if (!yy--){yy=99;cc--;}

    }

    return ((cc&3)*5+yy+(yy/4)+(mm*13/5)+dd-1)%7;

}

第三种方法:
int    week(int y,int m,int d)//年、月、日
{
    int m_d[12]={2,5,5,1,3,6,1,4,7,2,5,7};
    int i,j,k=0;
    int s=2;
    int w=0;
    if (((y%4==0)&&(y%100!=0))||(y%400)==0)
    {
        if (m<=2)
        j=y-1;
        else
        j=y;
    }
    else
        j=y;
    //润年计算,计算一共有多少个闰年
    for (i=1904;i<=y;i=i+4)
    {
       if (i%100!=0)
       k++;
       else if (i%400==0)
               k++;
    }
    w=((j-1904+s+k)+m_d[m-1]+d)%7;
    return (w);
}


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
15
关闭 站长推荐上一条 /3 下一条