你的位置:首页 > ASP.net教程

[ASP.net教程]你的程序支持复杂的时间调度嘛?


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

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

配置多种多样。比如,没做星期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     #endregion32 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       else44       {45         int temp = 0;46         if (int.TryParse(p3, out temp))47         {48           rets.Add(temp);49         }50       }51       return rets;52     }53     #endregion54 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:5965       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       else75       {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           else106           {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         else116         {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     #endregion218 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     #endregion253 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     #endregion286 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     #endregion333 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       else377       {378         int temp = 0;379         if (int.TryParse(p3, out temp))380         {381           rets.Add(temp);382         }383       }384       return rets;385     }386     #endregion387 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:59398       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       else408       {409         retObjs.Add("00:00");410       }411       return retObjs;412     }413     #endregion414   }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的,,,结果我太懒了。。。。




四川跟团旅游报价多少四川旅游线路大全四川旅游报价价格四川旅游团购优惠深圳去四川旅游报价上海欢乐谷好玩吗?怎么去? 华南植物园五一去怎么样?广州华南植物园五一看什么? 五一去桂林龙脊梯田怎么样?龙胜龙脊梯田什么季节去合适? 五一到华南植物园怎么去?广州华南植物园有什么花看? 亚洲论坛永久会址门票多少钱?博鳌亚洲论坛永久会址门票价格? 大云雾山门票包括什么?云浮大云雾山有另收费吗? 穹顶之下还有徽州 大云雾山小孩怎么收费?云浮大云雾山儿童票价格? 中山逍遥谷旅游?逍遥谷好玩吗? 中山逍遥谷有什么玩的?五桂山逍遥谷如何? 中山逍遥谷好不好玩呀?逍遥谷怎么样? 中山逍遥谷电话?五桂山逍遥谷门票预订? 去泰国哪里买手机好?要行货的 去迪拜买什么便宜?去迪拜旅游买什么好? 背包客在泰国曼谷住哪比较好? 马尔代夫两日游哪里好玩?马尔代夫两日游 IDT71V3558S166PFI Datasheet IDT71V3558S166PFI Datasheet IDT72V3640L6BB Datasheet IDT72V3640L6BB Datasheet IDT5V5218PGGI Datasheet IDT5V5218PGGI Datasheet 内蒙古到港澳5天游 内蒙古到港澳5天游 内蒙古到港澳5天游 齐齐哈尔跟团香港三天价格 齐齐哈尔跟团香港三天价格 齐齐哈尔跟团香港三天价格 黑龙江去港澳三天两晚游 黑龙江去港澳三天两晚游 黑龙江去港澳三天两晚游