- /*
- 输入某年某月某日,判断这一天是这一年的第几天、第几周,星期几。
- ――ISO8601规定:星期一为一周的第一天。
- 某一周属于某年(或某月)的认定标准是:是否有四天以上属于该年(或该月)。
- */
- #include <stdio.h>
- int HowmanyDays(int y, int m, int d);
- int HowmanyWeeks(int y, int m, int d);
- int WhatDay(int y, int m, int d);
- int main(void)
- {
- int y, m, d; //年月日周
- int i, j, mm, yy;
- int n = 0, w; //第几天,周几
- printf("输入日期,格式:年.月.日:");
- scanf("%d.%d.%d", &y, &m, &d);
- printf("%d年%d月%d日星期%d是该年第%d天、第%d周\\n",y,m,d,WhatDay(y,m,d),HowmanyDays(y,m,d),HowmanyWeeks(y,m,d));
- }
- //计算是第几天
- int HowmanyDays(int y, int m, int d)
- {
- int i = 0, n =0;
- int days[12] ={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- while(i+1 < m) //按月累加
- n += days[i++];
- n += d; //加本月的天
- if(((y%4 == 0 && y%100 != 0) || y%400 == 0) && m > 2) //闰年且2月后加多一天
- n++;
- return n;
- }
- //计算是第几周
- int HowmanyWeeks(int y, int m, int d)
- {
- //若该年1月1日是周四之前,则该年周计数增加1月1日所在周的头几天;否则减少1月1日所在周的后几天
- int i = HowmanyDays(y, m, d) + WhatDay(y, 1, 1) - (WhatDay(y, 1, 1)>4 ? 8 : 1);
- return i<0 ? 0 : (i%7 == 0 ? i/7 :i/7 + 1);
- }
- //计算是星期几:Zeller公式
- int WhatDay(int y, int m, int d)
- {
- int w;
- if(m < 3)
- {
- m += 12;
- y--;
- }
- w = (y/100/4 - y/100*2 + y%100 + y%100/4 + 13*(m + 1)/5 + d - 1)%7;
- w = (w + 7)%7;
- return w == 0 ? 7 : w;
- }
- //该片段来自于http://www.codesnippet.cn/detail/170720134644.html
来源: http://www.codesnippet.cn/detail/170720134644.html