1: /// <summary>
2: /// 取指定日期是一年中的第几周
3: /// </summary>
4: /// <param name="dtime">给定的日期</param>
5: /// <returns>数字 一年中的第几周</returns>
6: public static int WeekOfYear(DateTime dtime)
7: {
8: try
9: {
10: //确定此时间在一年中的位置
11: int dayOfYear = dtime.DayOfYear;
12: //当年第一天
13: DateTime tempDate = new DateTime(dtime.Year, 1, 1);
14: //确定当年第一天
15: int tempDayOfWeek = (int)tempDate.DayOfWeek;
16: tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;
17: ////确定星期几
18: int index = (int)dtime.DayOfWeek;
19: index = index == 0 ? 7 : index;
20:
21: //当前周的范围
22: DateTime retStartDay = dtime.AddDays(-(index - 1));
23: DateTime retEndDay = dtime.AddDays(6 - index);
24:
25: //确定当前是第几周
26: int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7);
27:
28: if (retStartDay.Year < retEndDay.Year)
29: {
30: weekIndex = 1;
31: }
32:
33: return weekIndex;
34: }
35: catch (Exception ex)
36: {
37: throw new Exception(ex.Message);
38: }
39:
40: }
41:
42:
43: /// <summary>
44: /// 求某年有多少周
45: /// </summary>
46: /// <param name="dtime"></param>
47: /// <returns></returns>
48: public static int GetWeekOfYear(DateTime dtime)
49: {
50: int countDay = DateTime.Parse(dtime.Year + "-12-31").DayOfYear;
51: int countWeek = countDay / 7;
52: return countWeek;
53: }
54:
55: //根据年月日获得星期几
56: public static string CaculateWeekDay(int month, int day)
57: {
58: string weekstr = string.Empty;
59: int year = DateTime.Now.Year;
60: //把一月和二月看成是上一年的十三月和十四月
61: if (month == 1) { month = 13; year--; }
62: if (month == 2) { month = 14; year--; }
63: int week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7;
64: switch (week)
65: {
66: case 0: weekstr = "1"; break;
67: case 1: weekstr = "2"; break;
68: case 2: weekstr = "3"; break;
69: case 3: weekstr = "4"; break;
70: case 4: weekstr = "5"; break;
71: case 5: weekstr = "6"; break;
72: case 6: weekstr = "7"; break;
73: }
74: return weekstr;
75: }
76:
77:
78: /// <summary>
79: /// 根据2个时间段获得相应的周数
80: /// </summary>
81: /// <param name="beginDate"></param>
82: /// <param name="endDate"></param>
83: /// <returns></returns>
84: public static int WeekOfDate(DateTime beginDate, DateTime endDate)
85: {
86: TimeSpan ts1 = new TimeSpan(beginDate.Ticks);
87: TimeSpan ts2 = new TimeSpan(endDate.Ticks);
88: TimeSpan ts = ts2.Subtract(ts1).Duration();
89: int weeks = ts.Days / 7;
90:
91: //确定此时间在一年中的位置
92: int dayOfYear = beginDate.DayOfYear;
93: //当年第一天
94: DateTime tempDate = new DateTime(beginDate.Year, beginDate.Month, beginDate.Day);
95: //最后一天
96: DateTime tempendDate = new DateTime(endDate.Year, endDate.Month, endDate.Day);
97: int tempDayOfWeek = (int)tempDate.DayOfWeek;
98: tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;
99:
100: ////确定星期几
101: int startindex = (int)beginDate.DayOfWeek;
102: startindex = startindex == 0 ? 7 : startindex;
103: //当前周的范围
104: DateTime retStartDay = beginDate.AddDays(-(startindex - 1));
105: DateTime retEndDay = beginDate.AddDays(7 - startindex);
106: //确定当前是第几周
107: int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek - 1) / 7);
108:
109: return weeks;
110: }
111:
112: /// <summary>
113: /// 根据起始时间,获取第几周
114: /// </summary>
115: /// <param name="dtime">当前时间</param>
116: /// <returns></returns>
117: public static int WeekOfTermDate(DateTime dtime)
118: {
119: string datetime = "2011-3-1";
120:
121: TimeSpan ts1 = new TimeSpan(dtime.Ticks);
122: TimeSpan ts2 = new TimeSpan(Convert.ToDateTime(datetime).Ticks);
123: TimeSpan ts = ts2.Subtract(ts1).Duration();
124:
125: //确定此时间在一年中的位置
126: int dayOfYear = ts.Days;
127: //当年第一天
128: DateTime tempDate = new DateTime(Convert.ToDateTime(datetime).Year, Convert.ToDateTime(datetime).Month, Convert.ToDateTime(datetime).Day);
129:
130: int tempDayOfWeek = (int)tempDate.DayOfWeek;
131: tempDayOfWeek = tempDayOfWeek == 0 ? 7 : tempDayOfWeek;
132: ////确定星期几
133: int index = (int)dtime.DayOfWeek;
134: index = index == 0 ? 7 : index;
135:
136: //当前周的范围
137: DateTime retStartDay = dtime.AddDays(-(index - 1));
138: DateTime retEndDay = dtime.AddDays(7 - index);
139:
140: //确定当前是第几周
141: int weekIndex = (int)Math.Ceiling(((double)dayOfYear + tempDayOfWeek) / 7);
142: return weekIndex;
143: }
144:
145: /// <summary>
146: /// 根据周,星期获得具体年月日
147: /// </summary>
148: /// <param name="week">第几周</param>
149: /// <param name="day">星期几</param>
150: /// <returns></returns>
151: public static DateTime DateTimeByWeekAndDay(int week, int day)
152: {
153: DateTime someTime = Convert.ToDateTime("2011-3-1");
154:
155: int i = someTime.DayOfWeek - DayOfWeek.Monday;
156: if (i == -1) i = 6;// i值 > = 0 ,因为枚举原因,Sunday排在最前,此时Sunday-Monday=-1,必须+7=6。
157: TimeSpan ts = new TimeSpan(i, 0, 0, 0);
158:
159: //获取第N周的星期一
160: someTime = someTime.Subtract(ts).AddDays((week - 1) * 7);
161: //获得星期几
162: someTime = someTime.AddDays(day - 1);
163: return someTime;
164: }
165:
166: /// <summary>
167: /// 获取一年中指定的一周的开始日期和结束日期。开始日期遵循ISO 8601即星期一。
168: /// </summary>
169: /// <param name="year">年(1 到 9999)</param>
170: /// <param name="weeks">周(1 到 53)</param>
171: /// <param name="weekrule">确定首周的规则</param>
172: /// <param name="first">当此方法返回时,则包含参数 year 和 weeks 指定的周的开始日期的 System.DateTime 值;如果失败,则为 System.DateTime.MinValue。如果参数 year 或 weeks 超出有效范围,则操作失败。该参数未经初始化即被传递。</param>
173: /// <param name="last">当此方法返回时,则包含参数 year 和 weeks 指定的周的结束日期的 System.DateTime 值;如果失败,则为 System.DateTime.MinValue。如果参数 year 或 weeks 超出有效范围,则操作失败。该参数未经初始化即被传递。</param>
174: /// <returns>成功返回 true,否则为 false。</returns>
175: public static bool GetDaysOfWeeks(int year, int weeks, CalendarWeekRule weekrule, out DateTime first, out DateTime last)
176: {
177: //初始化 out 参数
178: first = DateTime.MinValue;
179: last = DateTime.MinValue;
180:
181: //不用解释了吧...
182: if (year < 1 | year > 9999)
183: return false;
184:
185: //一年最多53周地球人都知道...
186: if (weeks < 1 | weeks > 53)
187: return false;
188:
189: //取当年首日为基准...为什么?容易得呗...
190: DateTime firstCurr = new DateTime(year, 1, 1);
191: //取下一年首日用于计算...
192: DateTime firstNext = new DateTime(year + 1, 1, 1);
193:
194: //将当年首日星期几转换为数字...星期日特别处理...ISO 8601 标准...
195: int dayOfWeekFirst = (int)firstCurr.DayOfWeek;
196: if (dayOfWeekFirst == 0) dayOfWeekFirst = 7;
197:
198: //得到未经验证的周首日...
199: first = firstCurr.AddDays((weeks - 1) * 7 - dayOfWeekFirst + 1);
200:
201: //周首日是上一年日期的情况...
202: if (first.Year < year)
203: {
204: switch (weekrule)
205: {
206: case CalendarWeekRule.FirstDay:
207: //不用解释了吧...
208: first = firstCurr;
209: break;
210: case CalendarWeekRule.FirstFullWeek:
211: //顺延一周...
212: first = first.AddDays(7);
213: break;
214: case CalendarWeekRule.FirstFourDayWeek:
215: //周首日距年首日不足4天则顺延一周...
216: if (firstCurr.Subtract(first).Days > 3)
217: {
218: first = first.AddDays(7);
219: }
220: break;
221: default:
222: break;
223: }
224: }
225: //得到未经验证的周末日...
226: last = first.AddDays(7).AddSeconds(-1);
227: switch (weekrule)
228: {
229: case CalendarWeekRule.FirstDay:
230: //周末日是下一年日期的情况...
231: if (last.Year > year)
232: last = firstNext.AddSeconds(-1);
233: else if (last.DayOfWeek != DayOfWeek.Monday)
234: last = first.AddDays(7 - (int)first.DayOfWeek).AddSeconds(-1);
235: break;
236: case CalendarWeekRule.FirstFourDayWeek:
237: //周末日距下一年首日不足4天则提前一周...
238: if (last.Year > year && firstNext.Subtract(first).Days < 4)
239: {
240: first = first.AddDays(-7);
241: last = last.AddDays(-7);
242: }
243: break;
244: default:
245: break;
246: }
247: return true;
248: }
249:
250:
251: }