標籤:c# datetime 年月日 每月每周 根據時間範圍擷取每月每周的分組
C#根據時間範圍擷取每月每周的分組
簡介:C#根據時間範圍擷取每月每周的分組,這個時間範圍可以是多年(2012.01.01-2015.12.31),
也可以是一年中的幾個月(2015.01.01-2015.12.31),也可以是月個月中的幾個星期
(2015.01.01-2015.01.21),根據起始日期和結束日期,產生一個以起始日期和結束日期為
鍵值對的字典(Dictionary<string, string> ),時間倉促,初步寫的演算法,以後再最佳化,目前
唯一的一點小遺憾就是,月中每周鍵值對的排序問題。詳細代碼如下:
-------------------------------------------------------------------------------------------------------------------------
根據時間範圍擷取每月每周的分組:
/// <summary> /// 根據時間範圍擷取每月每周的分組 /// </summary> /// <param name="strStartDate">起始時間</param> /// <param name="strEndDate">結束時間</param> /// <returns>返回每周起始結束索引值對</returns> /// <remarks>建立人員(日期):★彭振★(150106 11:12)</remarks> public static Dictionary<string, string> GetGroupWeekByDateRange(string strStartDate, string strEndDate) { Dictionary<string, string> dict = new Dictionary<string, string>(); DateTime dtStartDate = DateTime.Parse(strStartDate); DateTime dtEndDate = DateTime.Parse(strEndDate); //同年 if (dtStartDate.Year == dtEndDate.Year) { GetGroupWeekByYear(dict, dtStartDate, dtEndDate); } //不同年 else { int WhileCount = dtEndDate.Year - dtStartDate.Year; //某年一共有多少天 int YearDay = DateTime.IsLeapYear(dtStartDate.Year) ? 366 : 365; DateTime dtTempStartDate = dtStartDate; DateTime dtTempEndDate = dtTempStartDate.AddDays(YearDay - dtTempStartDate.DayOfYear); //根據時間範圍擷取每月每周的分組 GetGroupWeekByYear(dict, dtTempStartDate, dtTempEndDate); for (int i = 1; i < (WhileCount + 1); i++) { //某年某月一共有多少天 YearDay = DateTime.IsLeapYear(dtTempStartDate.Year + 1) ? 366 : 365; dtTempStartDate = DateTime.Parse(DateTime.Parse((dtTempStartDate.Year + 1) + "." + dtTempStartDate.Month + "." + "01").ToString("yyyy.MM.dd")); dtTempEndDate = dtTempStartDate.AddDays(YearDay - dtTempStartDate.DayOfYear); //根據時間範圍擷取每月每周的分組 GetGroupWeekByYear(dict, dtTempStartDate, dtTempEndDate); } } return dict; }
-------------------------------------------------------------------------------------------------------------------------
根據時間範圍(年)擷取每月每周的分組:
/// <summary> /// 根據時間範圍(年)擷取每月每周的分組 /// </summary> /// <param name="dict">每周起始結束索引值對</param> /// <param name="strStartDate">起始時間</param> /// <param name="strEndDate">結束時間</param> /// <remarks>建立人員(日期):★彭振★(150106 13:58)</remarks> public static void GetGroupWeekByYear(Dictionary<string, string> dict, DateTime dtStartDate, DateTime dtEndDate) { //不同月 if ((dtEndDate.Month - dtStartDate.Month) >= 1) { int WhileCount = dtEndDate.Month - dtStartDate.Month; //某年某月一共有多少天 int MonthDay = DateTime.DaysInMonth(dtStartDate.Year, dtStartDate.Month); DateTime dtTempStartDate = dtStartDate; DateTime dtTempEndDate = dtTempStartDate.AddDays(MonthDay - 1); //根據時間範圍擷取每月每周的分組 GetGroupWeekByMonth(dict, dtTempStartDate, dtTempEndDate); for (int i = 1; i < (WhileCount + 1); i++) { //某年某月一共有多少天 MonthDay = DateTime.DaysInMonth(dtTempStartDate.Year, dtTempStartDate.Month + 1); dtTempStartDate = DateTime.Parse(DateTime.Parse(dtTempStartDate.Year + "." + (dtTempStartDate.Month + 1) + "." + "01").ToString("yyyy.MM.dd")); dtTempEndDate = dtTempStartDate.AddDays(MonthDay - 1); //根據時間範圍擷取每月每周的分組 GetGroupWeekByMonth(dict, dtTempStartDate, dtTempEndDate); } } //同月 else { //根據時間範圍擷取每月每周的分組 GetGroupWeekByMonth(dict, dtStartDate, dtEndDate); } }
-------------------------------------------------------------------------------------------------------------------------
根據時間範圍(月)擷取每月每周的分組
/// <summary> /// 根據時間範圍(月)擷取每月每周的分組 /// </summary> /// <param name="dict">每周起始結束索引值對</param> /// <param name="strStartDate">起始時間</param> /// <param name="strEndDate">結束時間</param> /// <remarks>建立人員(日期):★彭振★(150106 11:13)</remarks> public static void GetGroupWeekByMonth(Dictionary<string, string> dict, DateTime dtStartDate, DateTime dtEndDate) { //一周 if ((dtEndDate.Day - dtStartDate.Day) < 7) { DayOfWeek day = dtStartDate.DayOfWeek; string dayString = day.ToString(); DateTime dtTempStartDate = dtStartDate; DateTime dtTempEndDate = dtEndDate; DateTime dtTempDate = DateTime.Now; switch (dayString) { case "Monday": dict.Add(dtTempStartDate.ToString(), dtTempEndDate.ToString()); break; case "Tuesday": dtTempDate = dtTempStartDate.Date.AddDays(+5); break; case "Wednesday": dtTempDate = dtTempStartDate.Date.AddDays(+4); break; case "Thursday": dtTempDate = dtTempStartDate.Date.AddDays(+3); break; case "Friday": dtTempDate = dtTempStartDate.Date.AddDays(+2); break; case "Saturday": dtTempDate = dtTempStartDate.Date.AddDays(+1); break; case "Sunday": dtTempDate = dtTempStartDate; break; } if (!dayString.Equals("Monday")) { dict.Add(dtTempStartDate.ToString(), dtTempDate.ToString()); dtTempDate = dtTempDate.Date.AddDays(+1); if (DateTime.Compare(dtTempDate, dtEndDate) <= 0) { dict.Add(dtTempDate.ToString(), dtTempEndDate.ToString()); } } } //多周 else { DayOfWeek day = dtStartDate.DayOfWeek; string dayString = day.ToString(); DateTime dtTempStartDate = dtStartDate; DateTime dtTempEndDate = dtEndDate; DateTime dtTempDate = DateTime.Now; #region 起始 switch (dayString) { case "Monday": dtTempDate = dtTempStartDate.Date.AddDays(+6); break; case "Tuesday": dtTempDate = dtTempStartDate.Date.AddDays(+5); break; case "Wednesday": dtTempDate = dtTempStartDate.Date.AddDays(+4); break; case "Thursday": dtTempDate = dtTempStartDate.Date.AddDays(+3); break; case "Friday": dtTempDate = dtTempStartDate.Date.AddDays(+2); break; case "Saturday": dtTempDate = dtTempStartDate.Date.AddDays(+1); break; case "Sunday": dtTempDate = dtTempStartDate; break; } dict.Add(dtTempStartDate.ToString(), dtTempDate.ToString()); dtTempStartDate = dtTempDate.Date.AddDays(+1); #endregion #region 結束 day = dtEndDate.DayOfWeek; dayString = day.ToString(); switch (dayString) { case "Monday": dtTempDate = dtEndDate; break; case "Tuesday": dtTempDate = dtEndDate.Date.AddDays(-1); break; case "Wednesday": dtTempDate = dtEndDate.Date.AddDays(-2); break; case "Thursday": dtTempDate = dtEndDate.Date.AddDays(-3); break; case "Friday": dtTempDate = dtEndDate.Date.AddDays(-4); break; case "Saturday": dtTempDate = dtEndDate.Date.AddDays(-5); break; case "Sunday": dtTempDate = dtEndDate.Date.AddDays(-6); break; } dict.Add(dtTempDate.ToString(), dtEndDate.ToString()); dtTempEndDate = dtTempDate.Date.AddDays(-1); #endregion int WhileCount = ((dtTempEndDate.Day - dtTempStartDate.Day) / 7); if (WhileCount == 0) { dict.Add(dtTempStartDate.ToString(), dtTempEndDate.ToString()); } else { for (int i = 0; i < (WhileCount + 1); i++) { dtTempDate = dtTempStartDate.Date.AddDays(+6); dict.Add(dtTempStartDate.ToString(), dtTempDate.ToString()); dtTempStartDate = dtTempDate.Date.AddDays(+1); ; } } } }
-------------------------------------------------------------------------------------------------------------------------
運用:
//根據時間範圍擷取每月每周的分組 Dictionary<string, string> dict = GetGroupWeekByDateRange("2012.01.01", "2015.12.31"); Dictionary<string, string> dict = GetGroupWeekByDateRange("2015.01.01", "2015.12.31"); Dictionary<string, string> dict = GetGroupWeekByDateRange("2015.01.01", "2015.01.21");
C#根據時間範圍擷取每月每周的分組