时隔两个月了,这段时间,游戏筹备正式上线,根据游戏平台数据反馈,反响还不错。
但是牵涉出新问题,就是活动。活动功能本身很简单。问题就在于,时间配置上,什么时间段开发活动。
配置多种多样。比如,没做星期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
新闻热点
疑难解答