精华内容
下载资源
问答
  • cron表达式每天整点执行一次的问题

    千次阅读 2020-11-13 10:21:42
    然后隔去看日志,发现,从10点0分0秒开始,每秒执行一次, 执行了3600次。然后才发现cron表达式配置错了,应该是 0 0 10 * * ?,这才是每天上午10点执行一次。幸亏是没有数据可以发短息,不然我要跑路了。 切记...

    最近写了个发短信的定时任务,需求是每天上午10点发信息,然后我百度了一篇文章,复制了一个cron表达式:* * 10 * * ?。然后隔天去看日志,发现,从10点0分0秒开始,每秒执行一次, 执行了3600次。然后才发现cron表达式配置错了,应该是 0 0 10 * * ?,这才是每天上午10点执行一次。幸亏是没有数据可以发短息,不然我要跑路了。

    切记:如果只是执行一次,要把表达式前边的*换成0.

    展开全文
  • 使用C#解析Cron表达式,得到执行时间 class Cron { private int[] seconds = new int[60]; private int[] minutes = new int[60]; private int[] hours = new int[24]; private int[] days =

    Cron表达式定义及详情

    请参考https://blog.csdn.net/HybridTheory_/article/details/88382442

    使用C#解析Cron表达式,得到执行时间

    class Cron
    {
        private int[] seconds = new int[60];
        private int[] minutes = new int[60];
        private int[] hours = new int[24];
        private int[] days = new int[31];
        private int[] month = new int[12];
        private int[] weeks = new int[7];
        //2019-2099年
        private int[] year = new int[80];
    
        public int[] Seconds { get => seconds; set => seconds = value; }
        public int[] Minutes { get => minutes; set => minutes = value; }
        public int[] Hours { get => hours; set => hours = value; }
        public int[] Days { get => days; set => days = value; }
        public int[] Month { get => month; set => month = value; }
        public int[] Weeks { get => weeks; set => weeks = value; }
        public int[] Year { get => year; set => year = value; }
    
        public Cron()
        {
            for (int i = 0; i < 60; i++)
            {
                seconds[i] = 0;
                minutes[i] = 0;
            }
            for (int i = 0; i < 24; i++)
            {
                hours[i] = 0;
            }
            for (int i = 0; i < 31; i++)
            {
                days[i] = 0;
            }
            for (int i = 0; i < 12; i++)
            {
                month[i] = 0;
            }
            for (int i = 0; i < 7; i++)
            {
                weeks[i] = 0;
            }
            for (int i = 0; i < 80; i++)
            {
                year[i] = 0;
            }
        }
    
        public void Init()
        {
            for (int i = 0; i < 7; i++)
            {
                weeks[i] = 0;
            }
            for (int i = 0; i < 31; i++)
            {
                days[i] = 0;
            }
        }
    }
    
    /// <summary>
    /// 在week上使用  5L表示本月最后一个星期五
    ///               7L表示本月最后一个星期天
    ///               
    /// 在week上使用  7#3表示每月的第三个星期天
    ///               2#4表示每月的第四个星期二
    /// </summary>
    public class CronHelp
    {
        /// <summary>
        /// Cron表达式转换(默认开始时间为当前)
        /// </summary>
        /// <param name="cron">表达式</param>
        /// <returns>最近5次要执行的时间</returns>
        private static List<DateTime> CronToDateTime(string cron)
        {
            try
            {
                List<DateTime> lits = new List<DateTime>();
                Cron c = new Cron();
                string[] arr = cron.Split(' ');
                Seconds(c, arr[0]);
                Minutes(c, arr[1]);
                Hours(c, arr[2]);
                Month(c, arr[4]);
                if (arr.Length < 7)
                {
                    Year(c, null);
                }
                else
                {
                    Year(c, arr[6]);
                }
                DateTime now = DateTime.Now;
                int addtime = 1;
                while (true)
                {
                    if (c.Seconds[now.Second] == 1 && c.Minutes[now.Minute] == 1 && c.Hours[now.Hour] == 1 && c.Month[now.Month - 1] == 1 && c.Year[now.Year - 2019] == 1)
                    {
                        if (arr[3] != "?")
                        {
                            Days(c, arr[3], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                lits.Add(now);
                            }
                        }
                        else
                        {
                            Weeks(c, arr[5], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                lits.Add(now);
                            }
                        }
                    }
                    if (lits.Count >= 5)
                    {
                        break;
                    }
                    c.Init();
                    if (!arr[1].Contains('-') && !arr[1].Contains(',') && !arr[1].Contains('*') && !arr[1].Contains('/'))
                    {
                        if (now.Minute == int.Parse(arr[1]))
                        {
                            addtime = 3600;
                        }
                    }
                    else if (arr[0] == "0" && now.Second == 0)
                    {
                        addtime = 60;
                    }
                    now = now.AddSeconds(addtime);
                }
                return lits;
            }
            catch
            {
                return null;
            }
        }
    
        /// <summary>
        /// Cron表达式转换(自定义开始时间)
        /// </summary>
        /// <param name="cron">表达式</param>
        /// <param name="now">开始时间</param>
        /// <returns>最近5次要执行的时间</returns>
        private static List<DateTime> CronToDateTime(string cron, DateTime now)
        {
            try
            {
                List<DateTime> lits = new List<DateTime>();
                Cron c = new Cron();
                string[] arr = cron.Split(' ');
                Seconds(c, arr[0]);
                Minutes(c, arr[1]);
                Hours(c, arr[2]);
                Month(c, arr[4]);
                if (arr.Length < 7)
                {
                    Year(c, null);
                }
                else
                {
                    Year(c, arr[6]);
                }
                int addtime = 1;
                while (true)
                {
                    if (c.Seconds[now.Second] == 1 && c.Minutes[now.Minute] == 1 && c.Hours[now.Hour] == 1 && c.Month[now.Month - 1] == 1 && c.Year[now.Year - 2019] == 1)
                    {
                        if (arr[3] != "?")
                        {
                            Days(c, arr[3], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                lits.Add(now);
                            }
                        }
                        else
                        {
                            Weeks(c, arr[5], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                lits.Add(now);
                            }
                        }
                    }
                    if (lits.Count >= 5)
                    {
                        break;
                    }
                    c.Init();
                    if (!arr[1].Contains('-') && !arr[1].Contains(',') && !arr[1].Contains('*') && !arr[1].Contains('/'))
                    {
                        if (now.Minute == int.Parse(arr[1]))
                        {
                            addtime = 3600;
                        }
                    }
                    else if (arr[0] == "0" && now.Second == 0)
                    {
                        addtime = 60;
                    }
                    now = now.AddSeconds(addtime);
                }
                return lits;
            }
            catch
            {
                return null;
            }
        }
    
        /// <summary>
        /// Cron表达式转换(默认开始时间为当前)
        /// </summary>
        /// <param name="cron">表达式</param>
        /// <returns>最近要执行的时间字符串</returns>
        public static string GetNextDateTime(string cron)
        {
            try
            {
                DateTime now = DateTime.Now;
                string[] arr = cron.Split(' ');
                if (IsOrNoOne(cron))
                {
                    string date = arr[6] + "/" + arr[4] + "/" + arr[3] + " " + arr[2] + ":" + arr[1] + ":" + arr[0];
                    if (DateTime.Compare(Convert.ToDateTime(date), now) >= 0)
                    {
                        return date;
                    }
                    else
                    {
                        return null;
                    }
                }
                Cron c = new Cron();
                Seconds(c, arr[0]);
                Minutes(c, arr[1]);
                Hours(c, arr[2]);
                Month(c, arr[4]);
                if (arr.Length < 7)
                {
                    Year(c, null);
                }
                else
                {
                    Year(c, arr[6]);
                }
                int addtime = 1;
                while (true)
                {
                    if (c.Seconds[now.Second] == 1 && c.Minutes[now.Minute] == 1 && c.Hours[now.Hour] == 1 && c.Month[now.Month - 1] == 1 && c.Year[now.Year - 2019] == 1)
                    {
                        if (arr[3] != "?")
                        {
                            Days(c, arr[3], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                return now.ToString("yyyy/MM/dd HH:mm:ss");
                            }
                        }
                        else
                        {
                            Weeks(c, arr[5], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                return now.ToString("yyyy/MM/dd HH:mm:ss");
                            }
                        }
                    }
                    c.Init();
                    if (!arr[1].Contains('-') && !arr[1].Contains(',') && !arr[1].Contains('*') && !arr[1].Contains('/'))
                    {
                        if (now.Minute == int.Parse(arr[1]))
                        {
                            addtime = 3600;
                        }
                    }
                    else if (arr[0] == "0" && now.Second == 0)
                    {
                        addtime = 60;
                    }
                    now = now.AddSeconds(addtime);
                }
            }
            catch
            {
                return null;
            }
        }
    
        /// <summary>
        /// Cron表达式转换(自定义开始时间)
        /// </summary>
        /// <param name="cron">表达式</param>
        /// <param name="now">开始时间</param>
        /// <returns>最近要执行的时间字符串</returns>
        public static string GetNextDateTime(string cron, DateTime now)
        {
            try
            {
                string[] arr = cron.Split(' ');
                if (IsOrNoOne(cron))
                {
                    string date = arr[6] + "/" + arr[4] + "/" + arr[3] + " " + arr[2] + ":" + arr[1] + ":" + arr[0];
                    if(DateTime.Compare(Convert.ToDateTime(date),now)>0)
                    {
                        return date;
                    }
                    else
                    {
                        return null;
                    }
                }
                Cron c = new Cron();
                Seconds(c, arr[0]);
                Minutes(c, arr[1]);
                Hours(c, arr[2]);
                Month(c, arr[4]);
                if (arr.Length < 7)
                {
                    Year(c, null);
                }
                else
                {
                    Year(c, arr[6]);
                }
                int addtime = 1;
                while (true)
                {
                    if (c.Seconds[now.Second] == 1 && c.Minutes[now.Minute] == 1 && c.Hours[now.Hour] == 1 && c.Month[now.Month - 1] == 1 && c.Year[now.Year - 2019] == 1)
                    {
                        if (arr[3] != "?")
                        {
                            Days(c, arr[3], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                return now.ToString("yyyy/MM/dd HH:mm:ss");
                            }
                        }
                        else
                        {
                            Weeks(c, arr[5], DateTime.DaysInMonth(now.Year, now.Month), now);
                            int DayOfWeek = (((int)now.DayOfWeek) + 6) % 7;
                            if (c.Days[now.Day - 1] == 1 && c.Weeks[DayOfWeek] == 1)
                            {
                                return now.ToString("yyyy/MM/dd HH:mm:ss");
                            }
                        }
                    }
                    c.Init();
                    if (!arr[1].Contains('-') && !arr[1].Contains(',') && !arr[1].Contains('*') && !arr[1].Contains('/'))
                    {
                        if (now.Minute == int.Parse(arr[1]))
                        {
                            addtime = 3600;
                        }
                    }
                    else if (arr[0] == "0" && now.Second == 0)
                    {
                        addtime = 60;
                    }
                    now = now.AddSeconds(addtime);
                }
            }
            catch
            {
                return null;
            }
        }
    
        /// <summary>
        /// Cron表达式转换成中文描述
        /// </summary>
        /// <param name="cronExp"></param>
        /// <returns></returns>
        public static string TranslateToChinese(string cronExp)
        {
            if (cronExp == null || cronExp.Length < 1)
            {
                return "cron表达式为空";
            }
            string[] tmpCorns = cronExp.Split(" ");
            StringBuilder sBuffer = new StringBuilder();
            if (tmpCorns.Length == 6)
            {
                //解析月
                if (!tmpCorns[4].Equals("*"))
                {
                    sBuffer.Append(tmpCorns[4]).Append("月");
                }
                else
                {
                    sBuffer.Append("每月");
                }
                //解析周
                if (!tmpCorns[5].Equals("*") && !tmpCorns[5].Equals("?"))
                {
                    char[] tmpArray = tmpCorns[5].ToCharArray();
                    foreach (char tmp in tmpArray)
                    {
                        switch (tmp)
                        {
                            case '1':
                                sBuffer.Append("星期天");
                                break;
                            case '2':
                                sBuffer.Append("星期一");
                                break;
                            case '3':
                                sBuffer.Append("星期二");
                                break;
                            case '4':
                                sBuffer.Append("星期三");
                                break;
                            case '5':
                                sBuffer.Append("星期四");
                                break;
                            case '6':
                                sBuffer.Append("星期五");
                                break;
                            case '7':
                                sBuffer.Append("星期六");
                                break;
                            case '-':
                                sBuffer.Append("至");
                                break;
                            default:
                                sBuffer.Append(tmp);
                                break;
                        }
                    }
                }
    
                //解析日
                if (!tmpCorns[3].Equals("?"))
                {
                    if (!tmpCorns[3].Equals("*"))
                    {
                        sBuffer.Append(tmpCorns[3]).Append("日");
                    }
                    else
                    {
                        sBuffer.Append("每日");
                    }
                }
    
                //解析时
                if (!tmpCorns[2].Equals("*"))
                {
                    sBuffer.Append(tmpCorns[2]).Append("时");
                }
                else
                {
                    sBuffer.Append("每时");
                }
    
                //解析分
                if (!tmpCorns[1].Equals("*"))
                {
                    sBuffer.Append(tmpCorns[1]).Append("分");
                }
                else
                {
                    sBuffer.Append("每分");
                }
    
                //解析秒
                if (!tmpCorns[0].Equals("*"))
                {
                    sBuffer.Append(tmpCorns[0]).Append("秒");
                }
                else
                {
                    sBuffer.Append("每秒");
                }
            }
            return sBuffer.ToString();
        }
    
        #region 初始化Cron对象
        private static void Seconds(Cron c, string str)
        {
            if (str == "*")
            {
                for (int i = 0; i < 60; i++)
                {
                    c.Seconds[i] = 1;
                }
            }
            else if (str.Contains('-'))
            {
                int begin = int.Parse(str.Split('-')[0]);
                int end = int.Parse(str.Split('-')[1]);
                for (int i = begin; i <= end; i++)
                {
                    c.Seconds[i] = 1;
                }
            }
            else if (str.Contains('/'))
            {
                int begin = int.Parse(str.Split('/')[0]);
                int interval = int.Parse(str.Split('/')[1]);
                while (true)
                {
                    c.Seconds[begin] = 1;
                    if ((begin + interval) >= 60)
                        break;
                    begin += interval;
                }
            }
            else if (str.Contains(','))
            {
    
                for (int i = 0; i < str.Split(',').Length; i++)
                {
                    c.Seconds[int.Parse(str.Split(',')[i])] = 1;
                }
            }
            else
            {
                c.Seconds[int.Parse(str)] = 1;
            }
        }
        private static void Minutes(Cron c, string str)
        {
            if (str == "*")
            {
                for (int i = 0; i < 60; i++)
                {
                    c.Minutes[i] = 1;
                }
            }
            else if (str.Contains('-'))
            {
                int begin = int.Parse(str.Split('-')[0]);
                int end = int.Parse(str.Split('-')[1]);
                for (int i = begin; i <= end; i++)
                {
                    c.Minutes[i] = 1;
                }
            }
            else if (str.Contains('/'))
            {
                int begin = int.Parse(str.Split('/')[0]);
                int interval = int.Parse(str.Split('/')[1]);
                while (true)
                {
                    c.Minutes[begin] = 1;
                    if ((begin + interval) >= 60)
                        break;
                    begin += interval;
                }
            }
            else if (str.Contains(','))
            {
    
                for (int i = 0; i < str.Split(',').Length; i++)
                {
                    c.Minutes[int.Parse(str.Split(',')[i])] = 1;
                }
            }
            else
            {
                c.Minutes[int.Parse(str)] = 1;
            }
        }
        private static void Hours(Cron c, string str)
        {
            if (str == "*")
            {
                for (int i = 0; i < 24; i++)
                {
                    c.Hours[i] = 1;
                }
            }
            else if (str.Contains('-'))
            {
                int begin = int.Parse(str.Split('-')[0]);
                int end = int.Parse(str.Split('-')[1]);
                for (int i = begin; i <= end; i++)
                {
                    c.Hours[i] = 1;
                }
            }
            else if (str.Contains('/'))
            {
                int begin = int.Parse(str.Split('/')[0]);
                int interval = int.Parse(str.Split('/')[1]);
                while (true)
                {
                    c.Hours[begin] = 1;
                    if ((begin + interval) >= 24)
                        break;
                    begin += interval;
                }
            }
            else if (str.Contains(','))
            {
    
                for (int i = 0; i < str.Split(',').Length; i++)
                {
                    c.Hours[int.Parse(str.Split(',')[i])] = 1;
                }
            }
            else
            {
                c.Hours[int.Parse(str)] = 1;
            }
        }
        private static void Month(Cron c, string str)
        {
            if (str == "*")
            {
                for (int i = 0; i < 12; i++)
                {
                    c.Month[i] = 1;
                }
            }
            else if (str.Contains('-'))
            {
                int begin = int.Parse(str.Split('-')[0]);
                int end = int.Parse(str.Split('-')[1]);
                for (int i = begin; i <= end; i++)
                {
                    c.Month[i - 1] = 1;
                }
            }
            else if (str.Contains('/'))
            {
                int begin = int.Parse(str.Split('/')[0]);
                int interval = int.Parse(str.Split('/')[1]);
                while (true)
                {
                    c.Month[begin - 1] = 1;
                    if ((begin + interval) >= 12)
                        break;
                    begin += interval;
                }
            }
            else if (str.Contains(','))
            {
    
                for (int i = 0; i < str.Split(',').Length; i++)
                {
                    c.Month[int.Parse(str.Split(',')[i]) - 1] = 1;
                }
            }
            else
            {
                c.Month[int.Parse(str) - 1] = 1;
            }
        }
        private static void Year(Cron c, string str)
        {
            if (str == null || str == "*")
            {
                for (int i = 0; i < 80; i++)
                {
                    c.Year[i] = 1;
                }
            }
            else if (str.Contains('-'))
            {
                int begin = int.Parse(str.Split('-')[0]);
                int end = int.Parse(str.Split('-')[1]);
                for (int i = begin - 2019; i <= end - 2019; i++)
                {
                    c.Year[i] = 1;
                }
            }
            else
            {
                c.Year[int.Parse(str) - 2019] = 1;
            }
        }
        private static void Days(Cron c, string str, int len, DateTime now)
        {
            for (int i = 0; i < 7; i++)
            {
                c.Weeks[i] = 1;
            }
            if (str == "*" || str == "?")
            {
                for (int i = 0; i < len; i++)
                {
                    c.Days[i] = 1;
                }
            }
            else if (str.Contains('-'))
            {
                int begin = int.Parse(str.Split('-')[0]);
                int end = int.Parse(str.Split('-')[1]);
                for (int i = begin; i <= end; i++)
                {
                    c.Days[i - 1] = 1;
                }
            }
            else if (str.Contains('/'))
            {
                int begin = int.Parse(str.Split('/')[0]);
                int interval = int.Parse(str.Split('/')[1]);
                while (true)
                {
                    c.Days[begin - 1] = 1;
                    if ((begin + interval) >= len)
                        break;
                    begin += interval;
                }
            }
            else if (str.Contains(','))
            {
                for (int i = 0; i < str.Split(',').Length; i++)
                {
                    c.Days[int.Parse(str.Split(',')[i]) - 1] = 1;
                }
            }
            else if (str.Contains('L'))
            {
                int i = str.Replace("L", "") == "" ? 0 : int.Parse(str.Replace("L", ""));
                c.Days[len - 1 - i] = 1;
            }
            else if (str.Contains('W'))
            {
                c.Days[len - 1] = 1;
            }
            else
            {
                c.Days[int.Parse(str) - 1] = 1;
            }
        }
        private static void Weeks(Cron c, string str, int len, DateTime now)
        {
            if (str == "*" || str == "?")
            {
                for (int i = 0; i < 7; i++)
                {
                    c.Weeks[i] = 1;
                }
            }
            else if (str.Contains('-'))
            {
                int begin = int.Parse(str.Split('-')[0]);
                int end = int.Parse(str.Split('-')[1]);
                for (int i = begin; i <= end; i++)
                {
                    c.Weeks[i - 1] = 1;
                }
            }
            else if (str.Contains(','))
            {
                for (int i = 0; i < str.Split(',').Length; i++)
                {
                    c.Weeks[int.Parse(str.Split(',')[i]) - 1] = 1;
                }
            }
            else if (str.Contains('L'))
            {
                int i = str.Replace("L", "") == "" ? 0 : int.Parse(str.Replace("L", ""));
                if (i == 0)
                {
                    c.Weeks[6] = 1;
                }
                else
                {
                    c.Weeks[i - 1] = 1;
                    c.Days[GetLastWeek(i, now) - 1] = 1;
                    return;
                }
            }
            else if (str.Contains('#'))
            {
                int i = int.Parse(str.Split('#')[0]);
                int j = int.Parse(str.Split('#')[1]);
                c.Weeks[i - 1] = 1;
                c.Days[GetWeek(i - 1, j, now)] = 1;
                return;
            }
            else
            {
                c.Weeks[int.Parse(str) - 1] = 1;
            }
            //week中初始化day,则说明day没要求
            for (int i = 0; i < len; i++)
            {
                c.Days[i] = 1;
            }
        }
        #endregion
    
        #region 方法
    
        public static bool IsOrNoOne(string cron)
        {
            if (cron.Contains('-') || cron.Contains(',') || cron.Contains('/') || cron.Contains('*'))
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    
        /// <summary>
        /// 获取最后一个星期几的day
        /// </summary>
        /// <param name="i">星期几</param>
        /// <param name="now"></param>
        /// <returns></returns>
        private static int GetLastWeek(int i, DateTime now)
        {
            DateTime d = now.AddDays(1 - now.Day).Date.AddMonths(1).AddSeconds(-1);
            int DayOfWeek = ((((int)d.DayOfWeek) + 6) % 7) + 1;
            int a = DayOfWeek >= i ? DayOfWeek - i : 7 + DayOfWeek - i;
            return DateTime.DaysInMonth(now.Year, now.Month) - a;
        }
        /// <summary>
        /// 获取当月第几个星期几的day
        /// </summary>
        /// <param name="i">星期几</param>
        /// <param name="j">第几周</param>
        /// <param name="now"></param>
        /// <returns></returns>
        public static int GetWeek(int i, int j, DateTime now)
        {
            int day = 0;
            DateTime d = new DateTime(now.Year, now.Month, 1);
            int DayOfWeek = ((((int)d.DayOfWeek) + 6) % 7) + 1;
            if (i >= DayOfWeek)
            {
                day = (7 - DayOfWeek + 1) + 7 * (j - 2) + i;
            }
            else
            {
                day = (7 - DayOfWeek + 1) + 7 * (j - 1) + i;
            }
            return day;
        }
        #endregion
    
    }
    

    调用方法示例

    string cron="0 15 10 * * ?";
    CronHelp.GetNextDateTime(cron, DateTime.Now);
    CronHelp.CronToDateTime(cron, DateTime.Now);
    CronHelp.CronToDateTime(cron);
    
    展开全文
  • 定时任务只执行一次cron表达式

    万次阅读 2019-06-27 10:48:04
    只执行一次的定时任务 红色框里面的为cron表达式,从左往右分别为秒/分/时/日/月/...具体是那一天执行一次就不用加(?)问号了,没有必要。 cron表达式这样写就可以了,只会执行一次,然后就不会再执行了。 ...

    只执行一次的定时任务

    在这里插入图片描述
    红色框里面的为cron表达式,从左往右分别为秒/分/时/日/月/年
    cron表达式这样写就可以了,只会执行一次,然后就不会再执行了。

    展开全文
  • I want a cron expression which fires every 45 minutes.According to the documentation, I have created this 0 0/45 * * * ? expression.But it is fired in a pattern like 12:00, 12:45, 13:00, 13:45, 14:00....

    I want a cron expression which fires every 45 minutes.

    According to the documentation, I have created this 0 0/45 * * * ? expression.

    But it is fired in a pattern like 12:00, 12:45, 13:00, 13:45, 14:00.

    But what I expect and want is to be fired at 12:00, 12:45, 13:30, 14:15.

    What am I missing?

    解决方案

    Cron is not meant to solve such problems. It defines the exact date and times, when a trigger must be fired, not intervals. Use a simple schedule instead:

    TriggerBuilder.Create()

    .StartAt(startDate)

    .WithSimpleSchedule(

    simpleScheduleBuilder => simpleScheduleBuilder.WithIntervalInMinutes(45))

    .Build();

    Edit:

    It's either a simple schedule as above, or multiple cron triggers (Quartz jobs can have multiple triggers):

    0 0/45 12/3 * * ? # 12:00, 12:45, 15:00, 15:45, ...

    0 30 13/3 * * ? # 13:30, 16:30, ...

    0 15 14/3 * * ? # 14:15, 17:15, ...

    展开全文
  • cron表达式详解,cron表达式写法,cron表达式例子

    万次阅读 多人点赞 2018-01-03 12:55:09
    先了解每个位置代表的含义,在了解每个位置允许的范围,以及一些特殊写法,还有常用的案例,足够你掌握cron表达式
  • QuartZ Cron表达式 貌似指定不了 某一天这一辈子执行1那种
  • 转载及总结:cron表达式详解,cron表达式写法,cron表达式例子 cron表达式格式:{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}例 "0 0 12 ? * WED" 在每星期三下午12:00 执行(年份通常 ...
  • Cron表达式详细解读

    万次阅读 2020-12-14 14:12:45
    Cron表达式个字符串,字符串以5或6个空格隔开,分为6或7个域,每个域代表个含义,Cron有如下两种语法格式: 秒 分钟 小时 月份的第几 月份 周的第几 年份 1 Seconds ...
  • cron表达式

    2020-07-10 10:31:15
    最近工作(公司项目执行任务用到了这个,设置定时定点执行个计划任务)上用到了cron表达式,所以还是稍微研究了一下。 2. cron表达式 2.1 什么是cron表达式 Cron表达式个字符串,字符串以5或6个空格隔开,...
  • CRON表达式

    2020-07-17 18:24:15
    CRON表达式
  • Cron表达式

    2020-01-14 23:00:24
    前言 最近在学习spring定时任务...我理解的cron表达式串用来表示时间的字符串。cron表达式有以下两种表达方式: 秒 分钟 小时 日 月 星期 年 秒 分钟 小时 日 月 星期 根据上面的规则: 5 10 4 14 1 3 202...
  • Quartz Cron表达式 每周、每月执行一次 2018年03月23日 09:49:09 阅读数:1002更多 个人分类: spring 定时注解 系统中通常有些需要自动执行的任务,这些任务可能每隔一段时间就要执行一次,也可能需要在指定的...
  • Cron表达式个字符串,字符串以5或6个空格隔开,分为6或7个域,每个域代表个含义,Cron有如下两种语法格式:  Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth...
  • 1.cron表达字符含义 语法: Seconds Minutes Hours DayofMonth Month DayofWeek Year Seconds Minutes Hours DayofMonth Month DayofWeek 比较多的使用的通常是第二条,因为很少任务是...每隔1分钟执行一次:0 */1...
  •  Cron表达式个字符串,字符串以5或6个空格隔开,分为6或7个域,每个域代表个含义,Cron有如下两种语法格式:  (1)Seconds Minutes Hours DayofMonth Month DayofWeek Year  (2)Seconds Minutes ...
  • Cron表达式 cron的表达式被用来配置CronTrigger实例。 cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表: 1. Seconds 2. Minutes 3. Hours 4. Day-of-Mon....
  • Cron表达式个字符串,字符串以空格隔开,分为5或6个域,每个域代表个含义,系统支持的表达式格式如下(DayofWeek 为可选域。): Seconds Minutes Hours DayofMonth Month [DayofWeek] 1 二、字段含义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,272
精华内容 5,308
关键字:

cron表达式一天执行一次