首页 > 学院 > 开发设计 > 正文

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

2019-11-17 02:14:39
字体:
来源:转载
供稿:网友

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

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

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

配置多种多样。比如,没做星期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
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表