| using System; | 
| using System.Collections.Generic; | 
| using System.Globalization; | 
| using System.Linq; | 
| using System.Web; | 
|   | 
| namespace WebAPI.Models | 
| { | 
|     public class GetWeekList | 
|     { | 
|   | 
|         #region 根据时间获取当前是第几周 | 
|   | 
|         //如果12月31号与下一年的1月1好在同一个星期则算下一年的第一周 | 
|         public int GetWeekIndex(DateTime dTime) | 
|         { | 
|             try | 
|             { | 
|                 //确定此时间在一年中的位置(第多少天) | 
|                 int dayOfYear = dTime.DayOfYear; | 
|   | 
|                 //当年第一天 | 
|                 DateTime tempDate = new DateTime(dTime.Year, 1, 1); | 
|                 //确定当年第一天是周几 | 
|                 int tempDayOfWeek = (int)tempDate.DayOfWeek; | 
|                 //判断当前一月一号如果是周日(0),则默认为周一 | 
|                 tempDayOfWeek = tempDayOfWeek == 0 ? 1 : tempDayOfWeek; | 
|   | 
|                 //确定当前日期是星期几 | 
|                 int index = (int)dTime.DayOfWeek; | 
|                 //判断当前日期如果是周日(0),则默认为周一 | 
|                 index = index == 0 ? 1 : index; | 
|   | 
|                 //当前日期周的范围 | 
|                 DateTime retStartDay = dTime.AddDays(-(index - 1)); | 
|                 DateTime retEndDay = dTime.AddDays(7 - index); | 
|   | 
|                 //确定当前日期是第几周 | 
|                 int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7); | 
|   | 
|                 //对比当前日期周的开始和结束,判定是否跨年第一周 | 
|                 if (retStartDay.Year < retEndDay.Year) | 
|                 { | 
|                     weekIndex = 1; | 
|                 } | 
|   | 
|                 return weekIndex; | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 throw new Exception(ex.Message); | 
|             } | 
|             //string retVal = retStartDay.ToString("yyyy/MM/dd") + "~" + retEndDay.ToString("yyyy/MM/dd"); | 
|   | 
|         } | 
|         public int GetWeekIndex(string strDate) | 
|         { | 
|             try | 
|             { | 
|                 //需要判断的时间 | 
|                 DateTime dTime = Convert.ToDateTime(strDate); | 
|                 return GetWeekIndex(dTime); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 throw new Exception(ex.Message); | 
|             } | 
|   | 
|         } | 
|         #endregion | 
|   | 
|         #region 以周末为每周第一天来计算当前日期所属哪一年第几周 | 
|         public string getWeek(DateTime dtime) | 
|         { | 
|             int nowweekindex = 0; | 
|             //定义每周第一天为周末开始 | 
|             int[] aweek = new int[] { 0, 1, 2, 3, 4, 5, 6 }; | 
|             int weekd = 0; | 
|             string yearmonthweek = ""; | 
|             //确定此时间在一年中的位置(第多少天) | 
|             int dayofyear = dtime.DayOfYear; | 
|             //确定此时间在一年中的月份 | 
|             int dayofmonth = dtime.Month; | 
|             //确定当年第一天是周几 | 
|             //int dayofweek = (int)dtime.DayOfWeek; | 
|             //当年第一天 | 
|             DateTime dtfirstday = new DateTime(dtime.Year, 1, 1); | 
|             //确定当年第一天是周几 | 
|             int dtfirstdayofweek = (int)dtfirstday.DayOfWeek; | 
|             //DateTime dtlastday = new DateTime(dtime.Year, 12, 31); | 
|             //下一年第一天 | 
|             DateTime dtnextyear = new DateTime(dtime.Year + 1, 1, 1); | 
|             //int dtnextyeardayofweek = (int)dtnextyear.DayOfWeek; | 
|             //下一年第一天是周几 | 
|             int nextyear = sy(dtnextyear,aweek) - 1; | 
|             DateTime dtlastday1 = new DateTime(dtime.Year, 12, 31 - nextyear); | 
|             if ((int)dtime.DayOfYear - (int)dtfirstday.DayOfYear <= 7 - sy(dtfirstday,aweek)) | 
|             { | 
|                 nowweekindex = 1; | 
|                 yearmonthweek = dtime.Year + "_" + dayofmonth + "_" + nowweekindex; | 
|             } | 
|             else if ((int)dtime.DayOfYear <= (int)dtlastday1.DayOfYear) | 
|             { | 
|                 for (int j = 0; j < aweek.Length; j++) | 
|                 { | 
|                     if (Convert.ToInt32(aweek[j]) == dtfirstdayofweek) | 
|                     { | 
|                         int b = aweek.Length - (j + 1); | 
|                         int x = (dayofyear - 1) - b; | 
|                         weekd = x / 7; | 
|                         int yushu = x % 7; | 
|                         if (yushu != 0) | 
|                         { | 
|                             nowweekindex = weekd + 2; | 
|                             yearmonthweek = dtime.Year + "_" + dayofmonth + "_" + nowweekindex; | 
|                         } | 
|                         else | 
|                         { | 
|                             nowweekindex = weekd + 1; | 
|                             yearmonthweek = dtime.Year + "_" + dayofmonth + "_" + nowweekindex; | 
|                         } | 
|                     } | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 nowweekindex = weekd + 1; | 
|                 yearmonthweek = dtime.Year + 1 + "_" + 1 + "_" + nowweekindex; | 
|             } | 
|             return yearmonthweek; | 
|         } | 
|         | 
|   | 
|         public static int sy(DateTime dtime, int[] aweek) | 
|         { | 
|             int midnum = 0; | 
|             int midof = (int)dtime.DayOfWeek; | 
|             for (int i = 0; i < aweek.Length; i++) | 
|             { | 
|                 if (Convert.ToInt32(aweek[i]) == midof) | 
|                 { | 
|                     midnum = i; | 
|                 } | 
|             } | 
|             return midnum + 1; | 
|         } | 
|         #endregion | 
|   | 
|         public  string GetCodeDateStr(DateTime dtime) | 
|         { | 
|             DateTime currentTime = dtime; | 
|             var year = GetOfYear(currentTime); | 
|             var week = GetWeekOfYear(currentTime); | 
|             var weekStr = week < 10 ? $"0{week}" : week.ToString(); | 
|             var dateStr = $"{year}{weekStr}{getWeekOfDay(dtime)}"; ; | 
|             return dateStr; | 
|         } | 
|         private static int GetOfYear(DateTime dt) | 
|         { | 
|             var OfYear =int.Parse(dt.Year.ToString().ToCharArray()[3].ToString()); | 
|             GregorianCalendar gc = new GregorianCalendar(); | 
|             //判断当前日期是否是12月份 | 
|             int dayofmonth = dt.Month; | 
|             //判断当前日期是第几周 | 
|             int dayofweek = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); | 
|             //下一年的第一天 | 
|             DateTime dtfirstday = new DateTime(dt.Year + 1, 1, 1); | 
|             //确定下一年第一天是周几 | 
|             int dtfirstdayofweek = (int)dtfirstday.DayOfWeek; | 
|             //判断下一年第一天不为周日且当前日期为本年第12月且当前日期为本年第53周 | 
|             if (dtfirstdayofweek != 0 && dayofmonth == 12 && dayofweek == 53) | 
|             { | 
|                 OfYear = OfYear + 1;  //加一年 | 
|             } | 
|             else | 
|             { | 
|                 OfYear = int.Parse(dt.Year.ToString().ToCharArray()[3].ToString()); | 
|             } | 
|             return OfYear; | 
|         } | 
|         private static int GetWeekOfYear(DateTime dt) | 
|         { | 
|             int weekOfYear = 1; | 
|             GregorianCalendar gc = new GregorianCalendar(); | 
|             //判断当前日期是否是12月份 | 
|             int dayofmonth = dt.Month; | 
|             //判断当前日期是第几周 | 
|             int dayofweek=gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); | 
|             //下一年的第一天 | 
|             DateTime dtfirstday = new DateTime(dt.Year+1, 1, 1); | 
|             //确定下一年第一天是周几 | 
|             int dtfirstdayofweek = (int)dtfirstday.DayOfWeek; | 
|             //判断下一年第一天不为周日且当前日期为本年第12月且当前日期为本年第53周 | 
|             if (dtfirstdayofweek != 0&& dayofmonth == 12&&dayofweek ==53) | 
|             { | 
|                 weekOfYear = 1;  //下一年第一周 | 
|             } | 
|             else  | 
|             { | 
|                  weekOfYear = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); | 
|             } | 
|             return weekOfYear; | 
|         } | 
|         public static int getWeekOfDay(DateTime dtime) | 
|         { | 
|             int DayinWeek = 0; | 
|             string week = dtime.DayOfWeek.ToString(); | 
|             switch (week) | 
|             { | 
|                 case "Monday": | 
|                     DayinWeek = 2; | 
|                     break; | 
|                 case "Tuesday": | 
|                     DayinWeek = 3; | 
|                     break; | 
|                 case "Wednesday": | 
|                     DayinWeek = 4; | 
|                     break; | 
|                 case "Thursday": | 
|                     DayinWeek = 5; | 
|                     break; | 
|                 case "Friday": | 
|                     DayinWeek = 6; | 
|                     break; | 
|                 case "Saturday": | 
|                     DayinWeek = 7; | 
|                     break; | 
|                 case "Sunday": | 
|                     DayinWeek = 1; | 
|                     break; | 
|             } | 
|             return DayinWeek; | 
|         } | 
|     } | 
| } |