最近在工作的時候需要實現這麼一個功能,根據日曆控制項中選擇的日期,計算出這一天是本年度的第幾周,是星期幾,關於擷取星期幾,C#中已經提供了方法DayOfWeek(),下面看看怎麼計算第幾周:
/// <summary> /// 取指定日期是一年中的第幾周 /// </summary> /// <param name="dtime">給定的日期</param> /// <returns>數字 一年中的第幾周</returns> public int Weekofyear(DateTime dtime) { //int weeknum = 1; //DateTime tmpdate = DateTime.Parse(dtime.Year.ToString() + "-1" + "-1"); //DayOfWeek firstweek = tmpdate.DayOfWeek; ////if(firstweek) //for (int i = (int)firstweek + 1; i <= dtime.DayOfYear; i = i + 7) //{ // weeknum = weeknum + 1; //} //return weeknum ;
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;
}