你的程序支持复杂的时间调度嘛?

时隔两个月了,这段时间,游戏筹备正式上线,根据游戏平台数据反馈,反响还不错。

但是牵涉出新问题,就是活动。活动功能本身很简单。问题就在于,时间配置上,什么时间段开发活动。

配置多种多样。比如,没做星期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

 

看看结果

这样挺万能的吧?

如果每一天有两档活动开放

[2015][7][*][*][10:00-11:59/14:00-16:59]

 

 

当我完成了这个需求的时候,,新的需求又来了,,,妈蛋,,,需要倒计时,,活动还有多长时间开始。。

卧槽。。

好吧,,有需求就是大爷。。只能苦逼的程序去搞定了,需求一句话,我却花了一天时间啊。。。

我的思路是分解出,所包含的年月日,时间段开始。

 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

这里有一个蛋疼的问题,就是包含了星期,那么无疑与日期就要牵涉跨星期跨月,跨年了,

在这里特别鸣谢兄弟帮忙的分析。。

所以我分析出来,检查包含的年月日来构造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]

 

接下来我们在测试一下性能问题,

大家都懂的,在控制台输出打印是比较耗时的,这种情况下2000次也才1秒;效率是不必是说的。

全部完整代码。。

  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 492794628@qq.com
 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的,,,结果我太懒了。。。。

posted on 2015-07-20 15:35  無心道(失足程序员)  阅读(805)  评论(3编辑  收藏  举报