Cron表达式使用格式
Seconds | Minutes | Hours | DayofMonth Month | DayofWeek | [Year] |
---|
秒 | 分 | 时 | 天 | 月 | 周 |
每个符号代表的含义:
- :匹配该域的任意值;如用在分所在的域,表示每分钟都会触发事件。
- ?:匹配该域的任意值。
- -:匹配一个特定的范围值;如时所在的域的值是10-12,表示10、11、12点的时候会触发事件。
- ,:匹配多个指定的值;如周所在的域的值是2,4,6,表示在周一、周三、周五就会触发事件(1表示周日,2表示周一,3表示周二,以此类推,7表示周六)。
- /:左边是开始触发时间,右边是每隔固定时间触发一次事件,如秒所在的域的值是5/15,表示5秒、20秒、35秒、50秒的时候都触发一次事件。
- L:last,最后的意思,如果是用在天这个域,表示月的最后一天,如果是用在周所在的域,如6L,表示某个月最后一个周五。(外国周日是星耀日,周一是月耀日,一周的开始是周日,所以1L=周日,6L=周五。)
- W:weekday,工作日的意思。如天所在的域的值是15W,表示本月15日最近的工作日,如果15日是周六,触发器将触发上14日周五。如果15日是周日,触发器将触发16日周一。如果15日不是周六或周日,而是周一至周五的某一个,那么它就在15日当天触发事件。
- #:用来指定每个月的第几个星期几,如6#3表示某个月的第三个星期五。
#include <string.h>
#include <stdbool.h>
#include "cron.h"
#include "jobs.h"
#include "appointment.h"
#define MAX_NUM 5
#define NEED_CHARG 1
#define OFF_CHARG 2
void task_start_cb_callback(cron_job *job)
{
if (!cb_state)
{
start_cb();
}
}
void task_stop_cb_callback(cron_job *job)
{
if (cb_state)
{
stop_cb();
}
}
namespace appointment
{
cron_job * jobs[MAX_NUM * 2] = {0};
AppoEntry appoentry[MAX_NUM] = {0};
uint8_t valid_num = 0;
bool cb_state = 0;
uint8_t cb_set = NULL;
void set(AppoEntry *entries, uint8_t num)
{
uint8_t buff[20] = {0};
if (num > MAX_NUM || num == 0)
{
return;
}
memcpy(&appoentry[0], entries, sizeof(AppoEntry) * num);
cron_stop();
cron_job_clear_all();
for (uint8_t i = 0; i < num * 2; i += 2)
{
sprintf_s(buff, 20, "0 %02d %02d * * *",
(uint8_t)(appoentry[i].start_cron >> 8), appoentry[i].start_cron & 0x00ff);
jobs[i] = cron_job_create(buff, task_start_cb_callback, NULL);
sprintf_s(buff, 20, "0 %02d %02d * * *",
(uint8_t)(appoentry[i].stop_cron >> 8), appoentry[i].stop_cron & 0x00ff);
jobs[i+1] = cron_job_create(buff, task_stop_cb_callback, NULL);
}
valid_num = num;
cron_start();
}
void get(AppoEntry *entries, uint8_t num)
{
if (num >= valid_num || num == 0)
{
return;
}
memcpy(entries, &appoentry[0], sizeof(AppoEntry) * num);
}
void clear()
{
cron_stop();
cron_job_clear_all();
memset(&appoentry[0], 0, sizeof(AppoEntry) * MAX_NUM);
valid_num = 0;
}
}
实用的例子 表达式 含义
- “0 0 12 * * ?” 每天12:00触发事件
- “0 15 10 ? * *” 每天10:15触发事件
- “0 15 10 * * ?” 每天10:15触发事件
- “0 15 10 * * ? *” 每天10:15触发事件
- “0 15 10 * * ? 2005″ 2005年的每天10:15触发事件
- “0 * 14 * * ?” 每天14点开始触发,每分钟触发一次,14:59分结束
- “0 0/5 14 * * ?” 每天14点开始触发到14:59分结束的每5分钟触发一次事件
- “0 0/5 14,18 * * ?” 每天14点开始到14:59期间和18点到18:59期间的每5分钟触发一次事件
- “0 0-5 14 * * ?” 每天14点到14:05期间的每1分钟触发一次事件
- “0 10,44 14 ? 3 WED” 每年3月的星期三的14:10和14:44触发一次事件
- “0 15 10 ? * MON-FRI” 周一至周五的10:15触发一次事件
- “0 15 10 15 * ?” 每月15日10:15触发一次事件
- “0 15 10 L * ?” 每月最后一日的10:15触发一次事件
- “0 15 10 ? * 6L” 每月的最后一个星期五10:15触发一次事件
- “0 15 10 ? * 6L 2002-2005″ 2002年至2005年的每月的最后一个星期五10:15触发一次事件
- “0 15 10 ? * 6#3″ 每月的第三个星期五10:15触发一次事件
|