64,634
社区成员
发帖
与我相关
我的任务
分享
计算星期可以用蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形):
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下:
c:世纪(年的高两位数);
y:年(年的低两位数);
m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月
来计算,比如2005年1月1日要看作2004年的13月1日来计算);
d:日;
[]代表取整,即只要整数部分。
w:星期;w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,
5-星期五,6-星期六
以2005年2月14日为例:c=20,y=4,m=14,d=14
w = 4 + [4/4] + [20/4] - 2*20 + [26*(14+1)/10] + 14 - 1
= 4 + 1 + 5 - 40 + 39 + 14 - 1
= 22 (除以7余1)
所以2005年2月14日是星期一。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
//struct tm *gmtime(const time_t *timep);
//time_t mktime(struct tm *tm);
int main()
{
struct tm gm_time;
struct tm *ret_time;
int year, month, day;
memset(&gm_time, 0, sizeof(gm_time));
while (scanf("%d%d%d", &year, &month, &day) == 3)
{
gm_time.tm_year = year - 1900;
gm_time.tm_mon = month - 1;
gm_time.tm_mday = day;
time_t sec_time = mktime(&gm_time);
ret_time = localtime(&sec_time);
printf("it is %d days after Sunday :\n%s", ret_time->tm_wday, asctime(ret_time));
}
return 0;
}