static WEEK GetWeekday ( const UINT uYear, const UINT uMonth, const UINT uDay )
{
int a = (14 - uMonth) / 12;
int y = uYear - a;
int m = uMonth + 12 * a - 2;
int d = (uDay + y + y / 4 - y / 100 + y / 400 + 31 * m / 12) % 7; WEEK week_table[] = {WEEK_SUN, WEEK_MON, WEEK_TUE, WEEK_WED, WEEK_THU, WEEK_FRI, WEEK_SAT};
return week_table[d];
}
这个是看到别人用的关于求星期几的一个算法。
对于这样的算法,本人不是很懂,想求教大家给我解释下,这个算法是怎么实现的,为什么这样算??
详细点更好 谢谢了!

解决方案 »

  1.   

    用GetLocalTime获取SYSTEMTIME结构体。
    结构体里面的wDayOfWeek就是星期几。
    不用这么复杂。
      

  2.   

    int a = (14 - uMonth) / 12;
        int y = uYear - a;
        int m = uMonth + 12 * a - 2;
    前面这几行主要是调整下一年的月份,一年从3月开始算到第二年的2月为一整年,这样就把特殊2月份放到了最后面.
    int d = (uDay + y + y / 4 - y / 100 + y / 400 + 31 * m / 12) % 7;
    这句就是根据闰年平年计算了
      

  3.   

    这个算法是应该是从蔡勒公式推导出来的,它的原形是:w = (y + (y/4) + (c/4) - 2c + (26(m+1)/10 + d - 1) % 7w:星期
    c:世纪数减一(年份前两位数)
    y:年(后两位数)
    m:月(m的取值范围为3至14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
    d:日
    1582年10月4日以前的公式有所不同,如下:
    w = (y + (y/4) + (c/4) - 2c + (26(m+1)/10 + d + 3) % 7因罗马教皇修改历法,把1582年10月4日的下一天改为1582年10月15日