yusijie
2024-06-25 62939c858cd060996fda608e194ba20053be3c00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
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;
        }
    }
}