最近有一個項目要用到年份週期,用於數據統計圖表展現使用,當中用到年份週期,以及年份週期所在的日期範圍。當初設想經過已知數據來換算年份週期,通過搜索資料發現經過數據庫SQL語句來作,反而更加複雜。如今改變思路經過C#後臺代碼來算出兩段日期範圍中年份週期,在依據年份週期所對應的日期範圍進行數據庫查詢進行統計。須要解決如下兩個點問題,數據庫
第一點:依據日期查找所在年份的第幾周;spa
第二點:依據年份所在的週期計算出週期所在的日期範圍。blog
using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { GregorianCalendar gc = new GregorianCalendar(); int weekOfYear = gc.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstDay, DayOfWeek.Monday); Console.WriteLine("當前第{0}周", weekOfYear); DateTime startDate, lastDate; for (int i = 1; i <= 53; i++) { GetDaysOfWeeks(DateTime.Now.Year, i, out startDate, out lastDate); Console.WriteLine("第{0}周", i); Console.WriteLine(startDate); Console.WriteLine(lastDate); } Console.ReadLine(); } public static bool GetDaysOfWeeks(int year, int index, out DateTime first, out DateTime last) { first = DateTime.MinValue; last = DateTime.MinValue; if (year < 1700 || year > 9999) { //"年份超限" return false; } if (index < 1 || index > 53) { //"週數錯誤" return false; } DateTime startDay = new DateTime(year, 1, 1); //該年第一天 DateTime endDay = new DateTime(year + 1, 1, 1).AddMilliseconds(-1); int dayOfWeek = 0; if (Convert.ToInt32(startDay.DayOfWeek.ToString("d")) > 0) dayOfWeek = Convert.ToInt32(startDay.DayOfWeek.ToString("d")); //該年第一天爲星期幾 if (dayOfWeek == 0) { dayOfWeek = 7; } if (index == 1) { first = startDay.AddDays(7 - dayOfWeek - 6); if (dayOfWeek == 6) { last = first; } else { last = startDay.AddDays((7 - dayOfWeek)); } } else { first = startDay.AddDays((8 - dayOfWeek) + (index - 2) * 7); //index周的起始日期 last = first.AddDays(6); //if (last > endDay) //{ // last = endDay; //} } if (first > endDay) //startDayOfWeeks不在該年範圍內 { //"輸入週數大於本年最大週數"; return false; } return true; } } }
執行結果 string