[C FAQ]20.27 由一个日期, 怎样知道是星期几?
用mktime() 或localtime() (参见问题13.11 和13.12, 如果tm hour 的值位0,要注意DST (夏时制) 的调整); 或者Zeller 的congruence (参阅sci.math FAQ); 或者这个由Tomohiko Sakamoto 提供的优雅的代码:
int dayofweek(int y, int m, int d) /* 0 = Sunday */
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
参见问题13.12 和20.28。
参考资料: [ISO, Sec. 7.12.2.3]。
简单分析:
- 公元一年一月一日为星期一(现在世界各国通用一星期七天的制度。这个制度最早由君士坦丁大帝[Constantine the Great]制定。他在公元321年3月7日正式宣布7天为1周,这个制度一直沿用至今)。
- 算今天到公元一年一月一日有多少天,%7,一周7天,周而复始。
- 每年365天,365=52*7+1,所以,过一年,在算星期的时候,就相当于多了一天。
- 闰年多一天。过一个闰年,在3月及以后就要多加一