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