你的程序支持復雜的時間調度嘛?,程序支持調度
時隔兩個月了,這段時間,游戲籌備正式上線,根據游戲平台數據反饋,反響還不錯。
但是牽涉出新問題,就是活動。活動功能本身很簡單。問題就在於,時間配置上,什麼時間段開發活動。
配置多種多樣。比如,沒做星期2,4,6活動。每周的周六,周日,活動。指定月份和日期的活動。配置簡直是天花亂墜了。。。這尼瑪怎麼搞????
那麼有麼有萬能的配置方式呢?首先,我能想到的配置肯定是字符串格式的。
必須包含,年月日星期時間,這尼瑪不就犯難了嘛????我們C#的 DateTime 類型格式化只支持年月日,時分秒啊。星期怎麼控制???例如,我要每個星期的星期天搞一個活動,拉一拉充值消費我擦。。。
我自己都把自己繞暈了。。好吧。。。
後來想到一種方式,
[年][月][日][星期][時間]
[*][*][*][*][*]
這樣利於分割,配置,清晰。
然後就是驗證,時間在不在配置的時間開發內?
當然想到的*肯定是默認支持所有的
[2015][7][*][*][10:00-11:59]
這個格式,表示2015年的7月每一天的10點到12點為配置開啟時間
[2015][7-9][*][*][10:00-11:59]
這個格式,表示2015年的7月1日到9月30的每一天的10點到12點為配置開啟時間
[2015][7/9][*][*][10:00-11:59]
這個格式,表示2015年的7月或者9月的每一天的10點到12點為配置開啟時間
[2015][*][*][2/4/6][10:00-11:59]
這個格式,表示2015年的每一個星期2,星期4,星期6 的每一天的10點到12點為配置開啟時間
接下來,就是驗證這個時間格式。
1 #region 驗證當前時間 年,月,日,星期,是否符合 static bool VerifyDate(int nowItem, string items)
2 /// <summary>
3 /// 驗證當前時間 年,月,日,星期,是否符合
4 /// </summary>
5 /// <param name="items">1-7;表示 1 到 7 , 1/7 表示 1 或者 7</param>
6 /// <returns></returns>
7 static bool VerifyDate(int nowItem, string items)
8 {
9 string nowItemStr = nowItem.ToString();
10 if ("*".Equals(items) || nowItemStr.Equals(items)) { return true; }
11 else if (items.IndexOf("-") > 0)
12 {//區間劃分
13 string[] itemSplit = items.Split('-');
14 int item1 = 9999;
15 int.TryParse(itemSplit[0], out item1);
16 int item2 = 9999;
17 int.TryParse(itemSplit[1], out item2);
18
19 if (item1 <= nowItem && nowItem <= item2) { return true; }
20 }
21 else if (items.IndexOf("/") > 0)
22 {//或劃分
23 string[] weeksSplit = items.Split('/');
24 foreach (var item in weeksSplit)
25 {
26 if (nowItemStr.Equals(item)) { return true; }
27 }
28 }
29 return false;
30 }
31 #endregion
32
33 #region 驗證當期時間格式 static bool VerifyTime(DateTime date, string itemTime)
34 /// <summary>
35 /// 驗證當期時間格式
36 /// </summary>
37 /// <param name="date"></param>
38 /// <param name="itemTime"></param>
39 /// <returns></returns>
40 static bool VerifyTime(DateTime date, string itemTime)
41 {
42 bool ret = false;
43 if (!"*".Equals(itemTime))
44 {
45 var items = Regex.Split(itemTime, @"/");
46 foreach (var item in items)
47 {
48 string[] itemTimes = item.Split('-');
49 var hhmm = Regex.Split(itemTimes[0], @":|:");
50 int hh = 24;
51 int.TryParse(hhmm[0], out hh);
52 int mm = 60;
53 int.TryParse(hhmm[1], out mm);
54 if (date.Hour > hh || (date.Hour == hh && date.Minute >= mm))
55 {
56 if (itemTimes.Length > 1)
57 {
58 var hhmm1 = Regex.Split(itemTimes[1], @":|:");
59 int hh1 = 24;
60 int.TryParse(hhmm1[0], out hh1);
61 int mm1 = 60;
62 int.TryParse(hhmm1[1], out mm1);
63 if (date.Hour < hh1 || (date.Hour == hh1 && date.Minute < mm1)) { ret = true; }
64 else { ret = false; }
65 }
66 else { ret = true; }
67 }
68 else { ret = false; }
69 if (ret)
70 {
71 break;
72 }
73 }
74 }
75 else { ret = true; }
76 return ret;
77 }
78 #endregion
看看結果![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012018143507.png)
這樣挺萬能的吧?
如果每一天有兩檔活動開放
[2015][7][*][*][10:00-11:59/14:00-16:59]
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012018143656.png)
當我完成了這個需求的時候,,新的需求又來了,,,媽蛋,,,需要倒計時,,活動還有多長時間開始。。
臥槽。。
好吧,,有需求就是大爺。。只能苦逼的程序去搞定了,需求一句話,我卻花了一天時間啊。。。
我的思路是分解出,所包含的年月日,時間段開始。
1 #region 獲取配置的年月日星期等信息 static List<int> GetConfigDate(DateTime date, int p1, string p3)
2 /// <summary>
3 /// 獲取配置的年月日星期等信息
4 /// </summary>
5 /// <param name="date"></param>
6 /// <param name="p1"></param>
7 /// <param name="p3"></param>
8 /// <returns></returns>
9 static List<int> GetConfigDate(DateTime date, int p1, string p3)
10 {
11 List<int> rets = new List<int>();
12 string p1Str = p1.ToString();
13 if ("*".Equals(p3) || p1Str.Equals(p3))
14 {
15 rets.Add(p1);
16 rets.Add(p1 + 1);
17 }
18 else if (p3.IndexOf("-") > 0)
19 {
20 string[] weekSplit = p3.Split('-');
21 int week1 = 9999;
22 int.TryParse(weekSplit[0], out week1);
23
24 int week2 = 9999;
25 int.TryParse(weekSplit[1], out week2);
26 for (int i = week1; i < week2 + 1; i++)
27 {
28 rets.Add(i);
29 }
30 }
31 else if (p3.IndexOf("/") > 0)
32 {
33 string[] weeksSplit = p3.Split('/');
34 foreach (var item in weeksSplit)
35 {
36 int temp = 0;
37 if (int.TryParse(item, out temp))
38 {
39 rets.Add(temp);
40 }
41 }
42 }
43 else
44 {
45 int temp = 0;
46 if (int.TryParse(p3, out temp))
47 {
48 rets.Add(temp);
49 }
50 }
51 return rets;
52 }
53 #endregion
54
55 #region 獲取配置的時間字符串 static List<string> GetConfigTimeStr(string itemTime)
56 /// <summary>
57 /// 獲取配置的時間字符串
58 /// </summary>
59 /// <param name="itemTime">必須類似的格式 單條 00:00-23:59 多條00:00-23:59/00:00-23:59</param>
60 /// <returns></returns>
61 static List<string> GetConfigTimeStr(string itemTime)
62 {
63 List<string> retObjs = new List<string>();
64 // 00:00-23:59
65 if (!"*".Equals(itemTime))
66 {
67 var items = Regex.Split(itemTime, @"/");
68 foreach (var item in items)
69 {
70 string[] itemTimes = item.Split('-');
71 retObjs.Add(itemTimes[0]);
72 }
73 }
74 else
75 {
76 retObjs.Add("00:00");
77 }
78 return retObjs;
79 }
80 #endregion
這裡有一個蛋疼的問題,就是包含了星期,那麼無疑與日期就要牽涉跨星期跨月,跨年了,
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012018143606.png)
在這裡特別鳴謝兄弟幫忙的分析。。
所以我分析出來,檢查包含的年月日來構造datetime 然後完成7天構造器。來分析時間段。
如果是本月那麼就從當前的日期開始,如果不是本月那麼就從1號開始,
1 #region 處理星期包含的日期 日 static void ActionWeekDay(int weekmin, int weekmax, ref List<int> days, ref List<int> months, ref List<int> years)
2 /// <summary>
3 /// 處理星期包含的日期 日
4 /// </summary>
5 /// <param name="weekmin"></param>
6 /// <param name="weekmax"></param>
7 /// <param name="days"></param>
8 /// <param name="months"></param>
9 /// <param name="years"></param>
10 static void ActionWeekDay(int weekmin, int weekmax, ref List<int> days, ref List<int> months, ref List<int> years)
11 {
12 DateTime nowWeekDate = DateTime.Now;
13 List<int> tempDays, tempMonths, tempYears;
14 tempYears = years.ToList();
15 tempMonths = months.ToList();
16 tempDays = days.ToList();
17 foreach (var itemYear in tempYears)
18 {
19 foreach (var itemMonth in tempMonths)
20 {
21 int itemDay = 1;
22 if (nowWeekDate.Month == itemMonth)
23 {
24 itemDay = nowWeekDate.Day;
25 }
26 DateTime date = new DateTime(itemYear, itemMonth, itemDay);
27 for (int i = 0; i < 7; i++)
28 {
29 int week = (int)date.DayOfWeek;
30 if (week == 0)
31 {
32 week = 7;
33 }
34 if (weekmin <= week && week <= weekmax)
35 {
36 if (!days.Contains(date.Day))
37 {
38 days.Add(date.Day);
39 }
40 if (!months.Contains(date.Month))
41 {
42 months.Add(date.Month);
43 }
44 if (!years.Contains(date.Year))
45 {
46 years.Add(date.Year);
47 }
48 }
49 date = date.AddDays(1);
50 }
51 }
52 }
53 }
54 #endregion
驗證器
1 #region 驗證時間:[*][*][20/22][*][10:00-11:59/16:00-17:59] static public long VerifyDateTime(string timeStr)
2 /// <summary>
3 /// 驗證時間:[*][*][20/22][*][10:00-11:59/16:00-17:59]
4 /// <para>第一個是年,,第二個是月,第三個是日期,第四個是星期,第五個是時間,</para>
5 /// <para>每一個參數,"-" 表示 到 如:“2015-2017”表示 2015 到 2017, "/" 表示 或者 如: “2015/2017”表示2015 或者 2017</para>
6 /// <para>返回值 -1 表示永久過期,0 表示在時間規則內,大於 0 表示倒計時</para>
7 /// </summary>
8 static public long VerifyDateTime(string timeStr)
9 {
10 var items = Regex.Split(timeStr, @";|;");
11 items.Reverse();
12 long ret = -1;
13 DateTime date = DateTime.Now;
14 foreach (var item in items)
15 {
16 //驗證時間匹配
17 if (VerifyConfigTimeStr(date, item))
18 {
19 ret = 0;
20 goto Lab_Exit;
21 }
22 //未通過時間匹配,檢查返回剩余時間
23 List<string> strs = new List<string>();
24 string[] timeStrs = item.Split(new char[] { ']' });
25 for (int i = 0; i < timeStrs.Length - 1; i++)
26 {
27 string time = timeStrs[i].Replace("[", "");
28 strs.Add(time);
29 }
30
31 string times = strs[4];
32 string weeks = strs[3];
33 string days = strs[2];
34 string months = strs[1];
35 string years = strs[0];
36
37 int hour = 0, minute = 0, second = 0;
38 var tempYears = GetConfigDate(date, date.Year, years);
39 var tempMonths = GetConfigDate(date, date.Month, months);
40 var tempDays = GetConfigDate(date, date.Day, days);
41 //由於星期比較特殊所以獲取與星期相關的日期的時候有點詭異。
42 if (!"*".Equals(weeks))
43 {
44 if (weeks.IndexOf("-") > 0)
45 {
46 //星期的間隔模式
47 string[] weekSplit = weeks.Split('-');
48 int weekmin = 9999;
49 int.TryParse(weekSplit[0], out weekmin);
50 int weekmax = 9999;
51 int.TryParse(weekSplit[1], out weekmax);
52 ActionWeekDay(weekmin, weekmax, ref tempDays, ref tempMonths, ref tempYears);
53 }
54 else if (weeks.IndexOf("/") > 0)
55 {
56 //星期的或模式
57 string[] weeksSplit = weeks.Split('/');
58 int tempWeek;
59 if (int.TryParse(weeksSplit[0], out tempWeek))
60 {
61 if (0 <= tempWeek && tempWeek <= 7)
62 {
63 ActionWeekDay(tempWeek, tempWeek, ref tempDays, ref tempMonths, ref tempYears);
64 }
65 }
66 }
67 else
68 {
69 //特定星期的模式
70 int tempweek = 0;
71 if (int.TryParse(weeks, out tempweek))
72 {
73 ActionWeekDay(tempweek, tempweek, ref tempDays, ref tempMonths, ref tempYears);
74 }
75 }
76 }
77 else
78 {
79 //未指定星期的模式
80 ActionWeekDay(1, 7, ref tempDays, ref tempMonths, ref tempYears);
81 }
82
83 var tempHHMMs = GetConfigTimeStr(times);
84
85 //進行簡單的排序
86 tempYears.Sort();
87 tempMonths.Sort();
88 tempDays.Sort();
89 tempHHMMs.Sort();
90
91 //接下來這裡是天坑,就是構造時間器比較,然後計算出倒計時
92 for (int y = 0; y < tempYears.Count; y++)
93 {
94 for (int m = 0; m < tempMonths.Count; m++)
95 {
96 for (int d = 0; d < tempDays.Count; d++)
97 {
98 for (int h = 0; h < tempHHMMs.Count; h++)
99 {
100 string[] hhmm = Regex.Split(tempHHMMs[h], ":|:");
101 if (int.TryParse(hhmm[0], out hour) && int.TryParse(hhmm[1], out minute))
102 {
103 DateTime actionTime = new DateTime(tempYears[y], tempMonths[m], tempDays[d], hour, minute, second);
104 if (actionTime > date)
105 {
106 if (VerifyConfigTimeStr(actionTime, item))
107 {
108 Console.WriteLine(actionTime.ToString("yyyy-MM-dd HH:mm:ss"));
109 TimeSpan ts = (actionTime - date);
110 ret = ts.Days * 24 * 60 * 60 + ts.Hours * 60 * 60 + ts.Minutes * 60 + ts.Seconds;
111 ret *= 1000;
112 ret += ts.Milliseconds;
113 goto Lab_Exit;
114 }
115 }
116 }
117 }
118 }
119 }
120 }
121 }
122 Lab_Exit:
123 return ret;
124 }
125 #endregion
驗證活動配置時間
[2016][2][*][*][10:00-11:59/14:00-16:59]
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012018143603.png)
接下來我們在測試一下性能問題,
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012018143644.png)
大家都懂的,在控制台輸出打印是比較耗時的,這種情況下2000次也才1秒;效率是不必是說的。
全部完整代碼。。
![](https://www.aspphp.online/bianchen/UploadFiles_4619/201701/2017012018143699.gif)
![]()
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Text.RegularExpressions;
6 using System.Threading.Tasks;
7
8 /**
9 *
10 * @author 失足程序員
11 * @Blog http://www.cnblogs.com/ty408/
12 * @mail
[email protected]
13 * @phone 13882122019
14 *
15 */
16 namespace Sz
17 {
18 /// <summary>
19 /// 時間驗證器
20 /// </summary>
21 public static class TimeUtil
22 {
23
24 //static void Main(string[] args)
25 //{
26 // Console.WriteLine("驗證當期時間是否滿足活動開放時間:[*][*][20/22][*][10:00-11:59/16:00-17:59]");
27 // System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
28 // watch.Restart();
29 // for (int i = 0; i < 5; i++)
30 // {
31 // long ticks = TimeUtil.VerifyDateTime("[2014/2016][9][*][*][10:00-11:59/16:00-22:59]");
32 // Console.WriteLine(ticks + " 倒計時:" + (ticks / 1000) + "秒");
33 // }
34 // watch.Stop();
35 // Console.WriteLine(watch.ElapsedMilliseconds);
36 // Console.ReadLine();
37 //}
38
39
40 /// <summary>
41 /// 驗證時間:[*][*][20/22][*][10:00-11:59/16:00-17:59]
42 /// <para>第一個是年,,第二個是月,第三個是日期,第四個是星期,第五個是時間,</para>
43 /// <para>每一個參數,"-" 表示 到 如:“2015-2017”表示 2015 到 2017, "/" 表示 或者 如: “2015/2017”表示2015 或者 2017</para>
44 /// <para>返回值 -1 表示永久過期,0 表示在時間規則內,大於 0 表示倒計時</para>
45 /// </summary>
46 static public long VerifyDateTime(string timeStr)
47 {
48 var items = Regex.Split(timeStr, @";|;");
49 items.Reverse();
50 long ret = -1;
51 DateTime date = DateTime.Now;
52 foreach (var item in items)
53 {
54 //驗證時間匹配
55 if (VerifyConfigTimeStr(date, item))
56 {
57 ret = 0;
58 goto Lab_Exit;
59 }
60 //未通過時間匹配,檢查返回剩余時間
61 List<string> strs = new List<string>();
62 string[] timeStrs = item.Split(new char[] { ']' });
63 for (int i = 0; i < timeStrs.Length - 1; i++)
64 {
65 string time = timeStrs[i].Replace("[", "");
66 strs.Add(time);
67 }
68
69 string times = strs[4];
70 string weeks = strs[3];
71 string days = strs[2];
72 string months = strs[1];
73 string years = strs[0];
74
75 int hour = 0, minute = 0, second = 0;
76 var tempYears = GetConfigDate(date, date.Year, years);
77 var tempMonths = GetConfigDate(date, date.Month, months);
78 var tempDays = GetConfigDate(date, date.Day, days);
79 //由於星期比較特殊所以獲取與星期相關的日期的時候有點詭異。
80 if (!"*".Equals(weeks))
81 {
82 if (weeks.IndexOf("-") > 0)
83 {
84 //星期的間隔模式
85 string[] weekSplit = weeks.Split('-');
86 int weekmin = 9999;
87 int.TryParse(weekSplit[0], out weekmin);
88 int weekmax = 9999;
89 int.TryParse(weekSplit[1], out weekmax);
90 ActionWeekDay(weekmin, weekmax, ref tempDays, ref tempMonths, ref tempYears);
91 }
92 else if (weeks.IndexOf("/") > 0)
93 {
94 //星期的或模式
95 string[] weeksSplit = weeks.Split('/');
96 int tempWeek;
97 if (int.TryParse(weeksSplit[0], out tempWeek))
98 {
99 if (0 <= tempWeek && tempWeek <= 7)
100 {
101 ActionWeekDay(tempWeek, tempWeek, ref tempDays, ref tempMonths, ref tempYears);
102 }
103 }
104 }
105 else
106 {
107 //特定星期的模式
108 int tempweek = 0;
109 if (int.TryParse(weeks, out tempweek))
110 {
111 ActionWeekDay(tempweek, tempweek, ref tempDays, ref tempMonths, ref tempYears);
112 }
113 }
114 }
115 else
116 {
117 //未指定星期的模式
118 ActionWeekDay(1, 7, ref tempDays, ref tempMonths, ref tempYears);
119 }
120
121 var tempHHMMs = GetConfigTimeStr(times);
122
123 //進行簡單的排序
124 tempYears.Sort();
125 tempMonths.Sort();
126 tempDays.Sort();
127 tempHHMMs.Sort();
128
129 //接下來這裡是天坑,就是構造時間器比較,然後計算出倒計時
130 for (int y = 0; y < tempYears.Count; y++)
131 {
132 for (int m = 0; m < tempMonths.Count; m++)
133 {
134 for (int d = 0; d < tempDays.Count; d++)
135 {
136 for (int h = 0; h < tempHHMMs.Count; h++)
137 {
138 string[] hhmm = Regex.Split(tempHHMMs[h], ":|:");
139 if (int.TryParse(hhmm[0], out hour) && int.TryParse(hhmm[1], out minute))
140 {
141 DateTime actionTime = new DateTime(tempYears[y], tempMonths[m], tempDays[d], hour, minute, second);
142 if (actionTime > date)
143 {
144 if (VerifyConfigTimeStr(actionTime, item))
145 {
146 Console.WriteLine(actionTime.ToString("yyyy-MM-dd HH:mm:ss"));
147 TimeSpan ts = (actionTime - date);
148 ret = ts.Days * 24 * 60 * 60 + ts.Hours * 60 * 60 + ts.Minutes * 60 + ts.Seconds;
149 ret *= 1000;
150 ret += ts.Milliseconds;
151 goto Lab_Exit;
152 }
153 }
154 }
155 }
156 }
157 }
158 }
159 }
160 Lab_Exit:
161 return ret;
162 }
163
164 #region 處理星期包含的日期 日 static void ActionWeekDay(int weekmin, int weekmax, ref List<int> days, ref List<int> months, ref List<int> years)
165 /// <summary>
166 /// 處理星期包含的日期 日
167 /// </summary>
168 /// <param name="weekmin"></param>
169 /// <param name="weekmax"></param>
170 /// <param name="days"></param>
171 /// <param name="months"></param>
172 /// <param name="years"></param>
173 static void ActionWeekDay(int weekmin, int weekmax, ref List<int> days, ref List<int> months, ref List<int> years)
174 {
175 DateTime nowWeekDate = DateTime.Now;
176 List<int> tempDays, tempMonths, tempYears;
177 tempYears = years.ToList();
178 tempMonths = months.ToList();
179 tempDays = days.ToList();
180 foreach (var itemYear in tempYears)
181 {
182 foreach (var itemMonth in tempMonths)
183 {
184 int itemDay = 1;
185 if (nowWeekDate.Month == itemMonth)
186 {
187 itemDay = nowWeekDate.Day;
188 }
189 DateTime date = new DateTime(itemYear, itemMonth, itemDay);
190 for (int i = 0; i < 7; i++)
191 {
192 int week = (int)date.DayOfWeek;
193 if (week == 0)
194 {
195 week = 7;
196 }
197 if (weekmin <= week && week <= weekmax)
198 {
199 if (!days.Contains(date.Day))
200 {
201 days.Add(date.Day);
202 }
203 if (!months.Contains(date.Month))
204 {
205 months.Add(date.Month);
206 }
207 if (!years.Contains(date.Year))
208 {
209 years.Add(date.Year);
210 }
211 }
212 date = date.AddDays(1);
213 }
214 }
215 }
216 }
217 #endregion
218
219 #region 驗證時間:[*][*][20/22][*][10:00-11:59/16:00-17:59] static bool VerifyConfigTimeStr(DateTime date, string timeStr)
220 /// <summary>
221 /// 驗證時間:[*][*][20/22][*][10:00-11:59/16:00-17:59]
222 /// <para>第一個是年,,第二個是月,第三個是日期,第四個是星期,第五個是時間,</para>
223 /// <para>每一個參數,"-" 表示 到 如:“2015-2017”表示 2015 到 2017, "/" 表示 或者 如: “2015/2017”表示2015 或者 2017</para>
224 /// </summary>
225 /// <returns></returns>
226 static bool VerifyConfigTimeStr(DateTime date, string timeStr)
227 {
228 List<string> strs = new List<string>();
229 string[] timeStrs = timeStr.Split(new char[] { ']' });
230 for (int i = 0; i < timeStrs.Length - 1; i++)
231 {
232 string time = timeStrs[i].Replace("[", "");
233 strs.Add(time);
234 }
235 if (VerifyDate(date.Year, strs[0]))
236 {
237 if (VerifyDate(date.Month, strs[1]))
238 {
239 int week = (int)date.DayOfWeek;
240 if (week == 0) { week = 7; }//星期天
241 if (VerifyDate(week, strs[3]))
242 {
243 if (VerifyDate(date.Day, strs[2]))
244 {
245 if (VerifyTime(date, strs[4])) { return true; }
246 }
247 }
248 }
249 }
250 return false;
251 }
252 #endregion
253
254 #region 驗證當前時間 年,月,日,星期,是否符合 static bool VerifyDate(int nowItem, string items)
255 /// <summary>
256 /// 驗證當前時間 年,月,日,星期,是否符合
257 /// </summary>
258 /// <param name="nowItem">參數</param>
259 /// <param name="items">1-7;表示 1 到 7 , 1/7 表示 1 或者 7</param>
260 /// <returns></returns>
261 static bool VerifyDate(int nowItem, string items)
262 {
263 string nowItemStr = nowItem.ToString();
264 if ("*".Equals(items) || nowItemStr.Equals(items)) { return true; }
265 else if (items.IndexOf("-") > 0)
266 {//區間劃分
267 string[] itemSplit = items.Split('-');
268 int item1 = 9999;
269 int.TryParse(itemSplit[0], out item1);
270 int item2 = 9999;
271 int.TryParse(itemSplit[1], out item2);
272
273 if (item1 <= nowItem && nowItem <= item2) { return true; }
274 }
275 else if (items.IndexOf("/") > 0)
276 {//或劃分
277 string[] weeksSplit = items.Split('/');
278 foreach (var item in weeksSplit)
279 {
280 if (nowItemStr.Equals(item)) { return true; }
281 }
282 }
283 return false;
284 }
285 #endregion
286
287 #region 驗證當期時間格式 static bool VerifyTime(DateTime date, string itemTime)
288 /// <summary>
289 /// 驗證當期時間格式
290 /// </summary>
291 /// <param name="date"></param>
292 /// <param name="itemTime"></param>
293 /// <returns></returns>
294 static bool VerifyTime(DateTime date, string itemTime)
295 {
296 bool ret = false;
297 if (!"*".Equals(itemTime))
298 {
299 var items = Regex.Split(itemTime, @"/");
300 foreach (var item in items)
301 {
302 string[] itemTimes = item.Split('-');
303 var hhmm = Regex.Split(itemTimes[0], @":|:");
304 int hh = 24;
305 int.TryParse(hhmm[0], out hh);
306 int mm = 60;
307 int.TryParse(hhmm[1], out mm);
308 if (date.Hour > hh || (date.Hour == hh && date.Minute >= mm))
309 {
310 if (itemTimes.Length > 1)
311 {
312 var hhmm1 = Regex.Split(itemTimes[1], @":|:");
313 int hh1 = 24;
314 int.TryParse(hhmm1[0], out hh1);
315 int mm1 = 60;
316 int.TryParse(hhmm1[1], out mm1);
317 if (date.Hour < hh1 || (date.Hour == hh1 && date.Minute < mm1)) { ret = true; }
318 else { ret = false; }
319 }
320 else { ret = true; }
321 }
322 else { ret = false; }
323 if (ret)
324 {
325 break;
326 }
327 }
328 }
329 else { ret = true; }
330 return ret;
331 }
332 #endregion
333
334 #region 獲取配置的年月日星期等信息 static List<int> GetConfigDate(DateTime date, int p1, string p3)
335 /// <summary>
336 /// 獲取配置的年月日星期等信息
337 /// </summary>
338 /// <param name="date"></param>
339 /// <param name="p1"></param>
340 /// <param name="p3"></param>
341 /// <returns></returns>
342 static List<int> GetConfigDate(DateTime date, int p1, string p3)
343 {
344 List<int> rets = new List<int>();
345 string p1Str = p1.ToString();
346 if ("*".Equals(p3) || p1Str.Equals(p3))
347 {
348 rets.Add(p1);
349 rets.Add(p1 + 1);
350 }
351 else if (p3.IndexOf("-") > 0)
352 {
353 string[] weekSplit = p3.Split('-');
354 int week1 = 9999;
355 int.TryParse(weekSplit[0], out week1);
356
357 int week2 = 9999;
358 int.TryParse(weekSplit[1], out week2);
359 for (int i = week1; i < week2 + 1; i++)
360 {
361 rets.Add(i);
362 }
363 }
364 else if (p3.IndexOf("/") > 0)
365 {
366 string[] weeksSplit = p3.Split('/');
367 foreach (var item in weeksSplit)
368 {
369 int temp = 0;
370 if (int.TryParse(item, out temp))
371 {
372 rets.Add(temp);
373 }
374 }
375 }
376 else
377 {
378 int temp = 0;
379 if (int.TryParse(p3, out temp))
380 {
381 rets.Add(temp);
382 }
383 }
384 return rets;
385 }
386 #endregion
387
388 #region 獲取配置的時間字符串 static List<string> GetConfigTimeStr(string itemTime)
389 /// <summary>
390 /// 獲取配置的時間字符串
391 /// </summary>
392 /// <param name="itemTime">必須類似的格式 單條 00:00-23:59 多條00:00-23:59/00:00-23:59</param>
393 /// <returns></returns>
394 static List<string> GetConfigTimeStr(string itemTime)
395 {
396 List<string> retObjs = new List<string>();
397 // 00:00-23:59
398 if (!"*".Equals(itemTime))
399 {
400 var items = Regex.Split(itemTime, @"/");
401 foreach (var item in items)
402 {
403 string[] itemTimes = item.Split('-');
404 retObjs.Add(itemTimes[0]);
405 }
406 }
407 else
408 {
409 retObjs.Add("00:00");
410 }
411 return retObjs;
412 }
413 #endregion
414 }
415 }
View Code
好了謝謝大家的收看。。。我搬磚去了。。。
忘了告訴大家,"-"表示間隔,"/"表示包含的意思 支持多個時間配置器哦;
[2015][7][20-31][*][10:00-11:59/14:00-16:59];[2015][8][1-5][*][10:00-11:59/14:00-16:59]
這樣配置表示2015年的7月20號到8月5號的每天兩檔活動~!
本想翻譯java的,,,結果我太懶了。。。。