怎么判断某年某月某日是星期几??

如题所述

这个 木有 难度的,楼上老兄的 代码 看不明白的 话 听我 讲个 大概 思路吧:
1.找一个基准点,比如1900年的一月一号是星期一
2.通过闰年的特性(被4整除不被400整除的年份是闰年)和每个月份大小月的特性(一月大二越小。。。你懂的),建立一张类似表的东西了
3.找一个 目标日期 比如x年 x月x日我们想知道是星期几了。通过上面的年份 月份表,求出这一天和 基准日起的 偏差,偏差的 星期 = 日期%7+1; 就是最后的结果了
4.还有不明白的或者想要个 代码什么的 385749807
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-07
万年历星期的算法(C语言)
#include <stdio.h>

unsigned char WeekTab[] =/* 闰年月星期表 */
{
(3 << 5) + 31,/* 1月 */
(6 << 5) + 29,/* 2月 */
(0 << 5) + 31,/* 3月 */
(3 << 5) + 30,/* 4月 */
(5 << 5) + 31,/* 5月 */
(1 << 5) + 30,/* 6月 */
(3 << 5) + 31,/* 7月 */
(6 << 5) + 31,/* 8月 */
(1 << 5) + 30,/* 9月 */
(4 << 5) + 31,/* 10月 */
(0 << 5) + 30,/* 11月 */
(2 << 5) + 31 /* 12月 */
};

/*----------------------
2000年~2099年星期算法
------------------------*/
unsigned char WeekDay20(unsigned char y, unsigned char m, unsigned char d)
{
unsigned char week, day;
day = WeekTab[m - 1]; /* 月表 */
week = day >> 5; /* 月星期数 */
day &= 0x1f; /* 月天数 */
if ((m < 3) && (y & 0x03)) /* 平年 */
{
if (m == 2) day--; /* 平年月天数 */
week++; /* 平年月表+1 */
}
y = y + (y >> 2); /* 年+年/4 */
week = (week + y + d + 2) % 7; /* (星期=年+年/4+月表+2日)%7 */
return (week << 5) | day; /* 返回星期和月天数 */
}

/*---------------------------------------
0000年~9999年星期算法
-----------------------------------------*/
unsigned char WeekDay(unsigned char c, unsigned char y,
unsigned char m, unsigned char d)
{
unsigned char week, day;
c &= 0x03; /* 百年%4 */
c = c | (c << 2); /* 百年%4*5 */
day = WeekTab[m - 1]; /* 月表 */
week = day >> 5; /* 月星期数 */
day &= 0x1f; /* 月天数 */
if ((m < 3) && !((c == 0) | (y & ((y & 0x03) == 0))))/* 平年 */
{
if (m == 2) day--; /* 平年月天数 */
week++; /* 平年月表+1 */
}
y = y + (y >> 2); /* 年+年/4 */
week = (week + c + y + d + 2) % 7;/* (星期=百年%4*5+年+年/4+月表+日+2)%7 */
return (week << 5) | day;/* 返回星期和月天数 */
}

unsigned char BcdToBin(unsigned char val)
{
val = (val >> 4) * 10 + (val & 0x0f);/* 将BCD码转换为10进制数 */
return val;/* 返回10进制数 */
}

void main(void)
{
unsigned char c, y, m, d;
unsigned char cx, yx, mx, dx;
unsigned char WDay, Week, Day;
/*---------------------------------------------------------
0001年1月1日 星期天
---------------------------------------------------------*/
c = 0x00;
y = 0x01;
m = 0x01;
d = 0x01;
cx = BcdToBin(c);/* 百年 */
yx = BcdToBin(y);/* 年 */
mx = BcdToBin(m);/* 月 */
dx = BcdToBin(d);/* 日 */
WDay = WeekDay(cx, yx, mx, dx);/* 取星期和月天数 */
Week = WDay >> 5;/* 得到星期 */
Day = WDay & 0x1f;/* 得到最大月天数 */
printf("week:%4d day:%4d\n",Week,Day);
/*---------------------------------------------------------
1918年1月21日 星期一
---------------------------------------------------------*/
c = 0x19;
y = 0x18;
m = 0x01;
d = 0x21;
cx = BcdToBin(c);/* 百年 */
yx = BcdToBin(y);/* 年 */
mx = BcdToBin(m);/* 月 */
dx = BcdToBin(d);/* 日 */
WDay = WeekDay(cx, yx, mx, dx);/* 取星期和月天数 */
Week = WDay >> 5;/* 得到星期 */
Day = WDay & 0x1f;/* 得到最大月天数 */
printf("week:%4d day:%4d\n",Week,Day);
/*---------------------------------------------------------
9999年12月31日 星期天
---------------------------------------------------------*/
c = 0x99;
y = 0x99;
m = 0x12;
d = 0x31;
cx = BcdToBin(c); /* 百年 */
yx = BcdToBin(y); /* 年 */
mx = BcdToBin(m); /* 月 */
dx = BcdToBin(d); /* 日 */
WDay = WeekDay(cx, yx, mx, dx);/* 取星期和月天数 */
Week = WDay >> 5; /* 得到星期 */
Day = WDay & 0x1f; /* 得到最大月天数 */
printf("week:%4d day:%4d\n",Week,Day);
/*---------------------------------------------------------
2004年6月18日 星期五
---------------------------------------------------------*/
c = 0x20;
y = 0x04;
m = 0x06;
d = 0x18;
cx = BcdToBin(c); /* 百年 */
yx = BcdToBin(y); /* 年 */
mx = BcdToBin(m); /* 月 */
dx = BcdToBin(d); /* 日 */
WDay = WeekDay20(yx, mx, dx);/* 取星期和月天数 */
Week = WDay >> 5; /* 得到星期 */
Day = WDay & 0x1f; /* 得到最大月天数 */
printf("week:%4d day:%4d\n",Week,Day);
/*---------------------------------------------------------
2018年3月8日 星期四
---------------------------------------------------------*/
c = 0x20;
y = 0x18;
m = 0x03;
d = 0x08;
cx = BcdToBin(c);/* 百年 */
yx = BcdToBin(y);/* 年 */
mx = BcdToBin(m);/* 月 */
dx = BcdToBin(d);/* 日 */
WDay = WeekDay20(yx, mx, dx);/* 取星期和月天数 */
Week = WDay >> 5;/* 得到星期 */
Day = WDay & 0x1f;/* 得到最大月天数 */
printf("week:%4d day:%4d\n",Week,Day);
while(1)
{
if(getchar()=='0') break;
}
}
第2个回答  2011-06-08
#include <stdio.h>
#include <time.h>

char *WeekDayName[]={" ","Mon","Tue","Wen","Thu","Fri","Sat","Sun"};
int YMD_2_JD(int Y, int M, int D){
const short MonthDay[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int JD,i;
JD=D;
for (i=1;i<M;i++) JD+=MonthDay[i];
if ((Y%4==0)&&(Y%100!=0)||(Y%400==0) && M>2) JD++;
return JD;
}

int YMD_2_WeekDay(int Y, int M, int D){
int offset,jd,weekD;
offset = ((Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400) % 7 ;
jd = YMD_2_JD(Y,M,D);
weekD = (jd + offset) % 7;
return weekD;
}

void main(){
int y=2011,m=6,d=8; // 自己输入 年月日
int r;
r = YMD_2_WeekDay(y,m,d); // 调用
printf("%s",WeekDayName[r]); // 星期几
}

详见我空间里的文章“C语言时间函数的应用”
第3个回答  2011-06-11
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Calendar;
public class CCC {
public static void main(String[] args) throws IOException {
System.out.println("请输入年月日,格式: yyyy-MM-dd");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
Calendar c = Calendar.getInstance(java.util.Locale.CHINA);
String[] sp = s.split("-");
c.set(Calendar.YEAR,Integer.parseInt(sp[0]));
c.set(Calendar.MONTH,Integer.parseInt(sp[1])-1);
c.set(Calendar.DATE,Integer.parseInt(sp[2]));

int wd = c.get(Calendar.DAY_OF_WEEK);
String x = "";
switch(wd){
case 1:x="星期日";break;
case 2:x="星期一";break;
case 3:x="星期二";break;
case 4:x="星期三";break;
case 5:x="星期四";break;
case 6:x="星期五";break;
case 7:x="星期六";break;
}
System.out.println(s+"是:"+x);
}
}
相似回答