时隔两个月了,这段时间,游戏筹备正式上线,根据游戏平台数据反馈,反响还不错。
但是牵涉出新问题,就是活动。活动功能本身很简单。问题就在于,时间配置上,什么时间段开发活动。
配置多种多样。比如,没做星期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 [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 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 }
好了谢谢大家的收看。。。我搬砖去了。。。
忘了告诉大家,"-"表示间隔,"/"表示包含的意思 支持多个时间配置器哦;
[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的,,,结果我太懒了。。。。
- 1楼kiler
- 你大可参考下corn表达式的定义,不用自己发明一个格式
- Re: 失足程序员
- @kiler,引用你大可参考下corn表达式的定义,不用自己发明一个格式,在下表示确实孤陋寡闻了。,也许重复造轮子了,总之莫倩实现了我想要的功能就行分享一下。当然有更好的也欢迎推荐