日期:2014-05-20  浏览次数:20756 次

菜鸟问题,大家一起帮忙看看,谢谢拉~~~~
请问各位,如何编写一个函数,求得具体一天是星期几?
比如:2001年9月18日是星期几?

另外还有个问题,.net的帮助文件里,我们经常看到一些已经定义好的函数,我们直接调用就可以了,那是否可以看到函数的原代码?还是只能调用,看不到原代码呢?

------解决方案--------------------
先要知道最早的一天是星期几
例如从2000年开始,那么就要知道2000年1月1日是星期几
之后要算出具体那一天离2000年1月1日相差多少天,再将这个天数余7取模
最后将2000年1月1日的星期几加上余下的模
如2000年1月1日是星期一,余下的模是1,那么具体那一天就是星期二(1+1)
 2000年1月1日是星期六,余下的模是6,那么具体那一天就是星期五(6+6-7)


以上仅做参考
------解决方案--------------------
private string date(int year,int month,int day)
{
// 1980 1 1 2
int days=0,k=0,i,z;
int years=year-1753;
string week= " ";
for(i=1753;i <=year;i++)
{
if(i%4==0&&i%100!=0||i%400==0)
{
k++;
}
}
days+=years*365+k;

if(year%4==0&&year%100!=0||year%400==0)
{
switch(month)
{
case 1:break;
case 2:days+=31;break;
case 3:days+=31+28;break;
case 4:days+=31+28+31;break;
case 5:days+=31+28+31+30;break;
case 6:days+=31+28+31+30+31;break;
case 7:days+=31+28+31+30+31+30;break;
case 8:days+=31+28+31+30+31+30+31;break;
case 9:days+=31+28+31+30+31+30+31+31;break;
case 10:days+=31+28+31+30+31+30+31+31+30;break;
case 11:days+=31+28+31+30+31+30+31+31+30+31;break;
case 12:days+=31+28+31+30+31+30+31+31+30+31+30;break;
}
}
else
{
switch(month)
{
case 1:break;
case 2:days+=31;break;
case 3:days+=31+28;break;
case 4:days+=31+28+31;break;
case 5:days+=31+28+31+30;break;
case 6:days+=31+28+31+30+31;break;
case 7:days+=31+28+31+30+31+30;break;
case 8:days+=31+28+31+30+31+30+31;break;
case 9:days+=31+28+31+30+31+30+31+31;break;
case 10:days+=31+28+31+30+31+30+31+31+30;break;
case 11:days+=31+28+31+30+31+30+31+31+30+31;break;
case 12:days+=31+28+31+30+31+30+31+31+30+31+30;break;
}
}
days+=day;
z=1+days%7;
if(z> =7)
{
z=z-7;
}
switch(z)
{
case 0:week= "星期六 ";break;
case 1:week= "星期天 ";break;
case 2:week= "星期一 ";break;
case 3:week= "星期二 ";break;
case 4:week= "星期三 ";break;
case 5:week= "星期四 ";break;
case 6:week= "星期五 ";break;


}
return week;
}

MessageBox.Show(date(2007,1,25));

输出的结果是:星期四


------解决方案--------------------
对于何一天是星期几算法的程序时间都比较简单,而在我自己的实际项目中采用的是基姆拉尔森计算公式,所以我在这里给出基姆拉尔森计算公式的C#的实现:

// ************************************************
// str_week
//
/// <summary>
/// 返回谋年某月任意一天是星期几的描述

/// </summary>

//y:年,m:月,d:日。在参数都只传入相应的整数
// ********************************************/

private string str_week(int y,int m,int d){
int a=7; // 用来保存计算得到的星期几的整数
string str_date= " ";
if((m==1)||(m==2))//如果是一月或二月进行换算
{
m+=12;
y--;
}
a=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; //得到的星期几的整数
switch (a){
case 0:
str_date= "星期一 ";
break;
case 1:
str_date= "星期二 ";
break;
case 2:
str_date= "星期三 ";
break;
case 3: