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; } } }