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


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

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

    配置多种多样。比如,没做星期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         #endregion
    32 
    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             else
    44             {
    45                 int temp = 0;
    46                 if (int.TryParse(p3, out temp))
    47                 {
    48                     rets.Add(temp);
    49                 }
    50             }
    51             return rets;
    52         }
    53         #endregion
    54 
    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:59
    65             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             else
    75             {
    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                     else
    106                     {
    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                 else
    116                 {
    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         #endregion
    218 
    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         #endregion
    253 
    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         #endregion
    286 
    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         #endregion
    333 
    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             else
    377             {
    378                 int temp = 0;
    379                 if (int.TryParse(p3, out temp))
    380                 {
    381                     rets.Add(temp);
    382                 }
    383             }
    384             return rets;
    385         }
    386         #endregion
    387 
    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:59
    398             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             else
    408             {
    409                 retObjs.Add("00:00");
    410             }
    411             return retObjs;
    412         }
    413         #endregion
    414     }
    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的,,,结果我太懒了。。。。

  • 相关阅读:
    四则运算 calc()
    如何创建width与height比例固定的元素
    eslint规则 中文备注
    使用gulp构建工具
    JavaScript 给表格排序
    【转】grunt动态生成文件名
    vim正则表达式(转)
    正则表达式30分钟入门教程(转)
    hdu 1874 Dijkstra算法
    centos7.4安装mysql
  • 原文地址:https://www.cnblogs.com/shizuchengxuyuan/p/4661576.html
Copyright © 2020-2023  润新知