時隔兩個月了,這段時間,游戲籌備正式上線,根據游戲平臺數據反饋,反響還不錯。
但是牽涉出新問題,就是活動。活動功能本身很簡單。問題就在于,時間配置上,什么時間段開發活動。
配置多種多樣。比如,沒做星期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
新聞熱點
疑難解答