計算指定年指定周的起止日期
阿新 • • 發佈:2019-01-24
搞個周計劃,資料庫設計只有年和周,客戶還要看日期。。
木有辦法,自己寫來不及,網上找了段程式碼自己改了改。。
廢話不多說,上程式碼。。
原文連結:http://hi.baidu.com/corbet/blog/item/1bb2982af3119329d42af1fd.html// <summary> /// 獲取一年中指定的一週的開始日期和結束日期。開始日期遵循ISO 8601即星期一。 /// </summary> /// <remarks>Write by vrhero</remarks> /// <param name="year">年(1 到 9999)</param> /// <param name="weeks">周(1 到 53)</param> /// <param name="weekrule">確定首周的規則</param> /// <returns>成功返回 true,否則為 false。</returns> public bool GetDaysOfWeeks(int year, int weeks, CalendarWeekRule weekrule) { //初始化引數 DateTime first = DateTime.MinValue; DateTime last = DateTime.MinValue; //不用解釋了吧 if (year < 1 | year > 9999) return false; //一年最多53周 if (weeks < 1 | weeks > 53) return false; //取當年首日為基準 DateTime firstCurr = new DateTime(year, 1, 1); //取下一年首日用於計算 DateTime firstNext = new DateTime(year + 1, 1, 1); //將當年首日星期幾轉換為數字 星期日特別處理 ISO 8601 標準 int dayOfWeekFirst = (int)firstCurr.DayOfWeek; if (dayOfWeekFirst == 0) dayOfWeekFirst = 7; //得到未經驗證的周首日 first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 1); //周首日是上一年日期的情況 if (first.Year < year) { switch (weekrule) { case CalendarWeekRule.FirstDay: first = firstCurr; break; case CalendarWeekRule.FirstFullWeek: //順延一週 first = first.AddDays(7); break; case CalendarWeekRule.FirstFourDayWeek: //周首日距年首日不足4天則順延一週 if (firstCurr.Subtract(first).Days > 3) { first = first.AddDays(7); } break; default: break; } } //得到未經驗證的週末日 last = first.AddDays(7).AddSeconds(-1); //週末日是下一年日期的情況 if (last.Year > year) { switch (weekrule) { case CalendarWeekRule.FirstDay: last = firstNext.AddSeconds(-1); break; case CalendarWeekRule.FirstFullWeek: //不用處理 break; case CalendarWeekRule.FirstFourDayWeek: //週末日距下一年首日不足4天則提前一週 if (firstNext.Subtract(first).Days < 4) { first = first.AddDays(-7); last = last.AddDays(-7); } break; default: break; } } return true; }