最近在工作的时候需要实现这么一个功能,根据日历控件中选择的日期,计算出这一天是本年度的第几周,是星期几,关于获取星期几,C#中已经提供了方法DayOfWeek(),下面看看怎么计算第几周:
public int Weekofyear(DateTime dtime)
{ //dtime为传进来的日期
int weeknum = 1; //默认的周数从1开始
DateTime firstdate = DateTime.Parse(dtime.Year.ToString() + "-1" + "-1"); //获取这一年的1月1号
DayOfWeek firstweek = firstdate .DayOfWeek; //将1月1号作为第一周,不管是不是周一
for (int i = (int)firstweek + 1; i <= dtime.DayOfYear; i = i + 7)
{ //(int)firstweek + 1表示第一周还剩的天数,dtime.DayOfYear当前时间是本年中的第几天,七天为一周期
weeknum = weeknum + 1;
}
return weeknum ;
上面的写法是本人自己写的,不过这个算法是把每年的1月1号作为起始点开始计算的,而不是将每年的第一个周一或周日作为起始点的,下面有一个改进的方法将每年的第一个周日作为起始点的,即如果1月1日不是周日,则不记为1,从下个周日开始计算,这个方法是根据他人的方法改编的
public int Weekofyear(DateTime dtime)
{
DateTime dtmFisrtDay =DateTime.Parse(dtime.Year.ToString() + "-1" + "-1"); //获取这一年的1月1号
string strWeek = dtmFisrtDay.DayOfWeek.ToString().ToLower(); ;
int intweek = 0;
switch (strWeek)
{
case "saturday":
intweek = 7;
break;
case "friday":
intweek = 6;
break;
case "thursday":
intweek = 5;
break;
case "wednesday":
intweek = 4;
break;
case "tuesday":
intweek = 3;
break;
case "monday":
intweek = 2;
break;
case "sunday":
intweek = 1;
break;
}
intweek = 8 - intweek;//第一周剩余的天数,为什么用8,因为在我的方法中周六是7,周日是开始1.
int intOutPut = 0;//要输出的周数
int intNow = dtime.DayOfYear; //当前是本年度的第几天
intOutPut = intNow / 7; //计算出大概周数
int intLoop = intNow % 7;
intLoop = intLoop - intweek;
if (intLoop > 0) //说明所选择的日期不足一周
{
// 所选择的日期不足一周这样就会出现少算一周的情况,这时候就要对intOutPut的值进行修正。
intOutPut = intOutPut + 1;
}
else
{
intOutPut = intOutPut + 0;
}
return intOutPut;
}