EasyCron supports most cron expressions that you can find in popular Cron implementations. Let's see some quick examples first.

Quick Cron Expression Examples

Cron Expression Meaning
* * * * * 2020 Execute a cron job every minute during the year 2020
* * * * * Execute a cron job every minute
*/5 * * * * Execute a cron job every 5 minutes
0 * * * * Execute a cron job every hour
0 12 * * * Fire at 12:00 PM (noon) every day
15 10 * * * Fire at 10:15 AM every day
15 10 * * ? Fire at 10:15 AM every day
15 10 * * * 2020-2022 Fire at 10:15 AM every day during the years 2020, 2021 and 2022
* 14 * * * Fire every minute starting at 2:00 PM and ending at 2:59 PM, every day
0/5 14,18 * * * Fire every 5 minutes starting at 2:00 PM and ending at 2:55 PM, AND fire every 5 minutes starting at 6:00 PM and ending at 6:55 PM, every day
0-5 14 * * * Fire every minute starting at 2:00 PM and ending at 2:05 PM, every day
10,44 14 * 3 3 Fire at 2:10 PM and at 2:44 PM every Wednesday in the month of March.
15 10 * * 1-5 Fire at 10:15 AM every Monday, Tuesday, Wednesday, Thursday and Friday
15 10 15 * * Fire at 10:15 AM on the 15th day of every month
15 10 L * * Fire at 10:15 AM on the last day of every month
15 10 * * 5L Fire at 10:15 AM on the last Friday of every month
15 10 * * 5#3 Fire at 10:15 AM on the third Friday of every month
0 12 1/5 * * Fire at 12:00 PM (noon) every 5 days every month, starting on the first day of the month.
11 11 11 11 * Fire every November 11th at 11:11 AM.
11 11 11 11 * 2020 Fire at 11:11 AM on November 11th in the year 2020.
0 0 * * 3 Fire at midnight of each Wednesday.
0 0 1,2 * * Fire at midnight of 1st, 2nd day of each month
0 0 1,2 * 3 Fire at midnight of 1st, 2nd day of each month, and each Wednesday.

Cron Job Expression Definition

A Cron Expression that EasyCron supports is a string comprising five fields separated by white space. Fields can contain any of the allowed values, along with various combinations of the allowed special characters for that field. The fields are as follows:

Field Name Mandatory Allowed Values Allowed Special Characters
Minutes YES 0 - 59 , - * /
Hours YES 0 - 23 , - * /
Day of month YES 1 - 31 , - * ? / L W
Month YES 1 - 12 (representing Jan - Dec), JAN - DEC (case-insensitive),
JANUARY - DECEMBER (case-insensitive)
, - * /
Day of week YES 0 - 6, 7 (representing Sun - Sat and Sun again), SUN - SAT (case-insensitive),
SUNDAY - SATURDAY (case-insensitive)
, - * ? / L #
Year NO empty or 1970-2099 , - * /

Special characters

Asterisk ( * )
The asterisk indicates that the cron expression matches for all values of the field. E.g., using an asterisk in the 1th field (minute) indicates every minute. * is a non-restricted character.
Slash ( / )
Slashes describe increments of ranges. For example 3-59/15 in the 1st field (minutes) indicate the third minute of the hour and every 15 minutes thereafter. The form "*/..." is equivalent to the form "first-last/...", that is, an increment over the largest possible range of the field.
Comma ( , )
Commas are used to separate items of a list. For example, using "1,2,5" in the 5th field (day of week) means Mondays, Wednesdays and Fridays.
Hyphen ( - )
Hyphens define ranges. For example, 2000-2010 indicates every year between 2000 and 2010 AD, inclusive.
L
'L' stands for "last". When used in the day-of-week field, it allows you to specify constructs such as "the last Friday" ("5L") of a given month. In the day-of-month field, it specifies the last day of the month.
W
The 'W' character is allowed for the day-of-month field. This character is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month." So, if the 15th is a Saturday, the trigger fires on Friday the 14th. If the 15th is a Sunday, the trigger fires on Monday the 16th. If the 15th is a Tuesday, then it fires on Tuesday the 15th. However if you specify "1W" as the value for day- of-month, and the 1st is a Saturday, the trigger fires on Monday the 3rd, as it does not 'jump' over the boundary of a month's days. The 'W' character can be specified only when the day-of-month is a single day, not a range or list of days.
Hash ( # )
'#' is allowed for the day-of-week field, and must be followed by a number between one and five. For example, 5#2 indicates "the second Friday" of a given month.
Question mark ( ? )
It is used instead of '*' for leaving either day-of-month or day-of-week blank. '?' is a non-restricted character. In practice, the effect of '?' is same as '*'.

Timezone

Your cron jobs will be run in either the timezone of your account, or the specified timezone you set up particularly for the cron job. Please check Setting up Timezone Individually for more information.

DST (Daylight Saving Time) concerns

Different Cron implementations might have chosen different ways to handle the DST issue. In order to understand how does EasyCron handle DST, you should firstly know what are legal time points. Because only legal time points will be evaluated.
E.g., in timezone America/Los_Angeles and year 2016, the clock Spring Forward from 2016-03-13 01:59:59 PST (after one second) to 2016-03-13 03:00:00 PDT. So we only consider the following seconds are legal (no 2016-03-13 02:00:00 PST):
2016-03-13 01:59:59 PST
2016-03-13 03:00:00 PDT
2016-03-13 03:00:01 PDT
...
And similarly, the clock Fall Back from 2016-11-06 01:59:59 PDT (after one second) to 2016-11-06 01:00:00 PST. Only the following seconds are legal (no 2016-11-06 02:00:00 PDT):
2016-11-06 01:59:59 PDT
2016-11-06 01:00:00 PST
2016-11-06 01:00:01 PST
...
Please pay attention when writing your cron expression, so that no execution will be skipped in "Spring Forward". For example, in timezone America/Los_Angeles, if you want to fire the cron job every day, instead of using 30 2 * * *, you should use 30 3 * * *, otherwise your cron job will not run at 2:30 AM on Mar 13, 2016, because there is no 02:30:00 PST, or 02:30:00 PDT on that day. To address this kind of problem, avoiding these vague hours is a good idea.
At the time when the DST ends (the "Fall Back" happens), there will be an hour of time (following the DST's end) during which no triggering occurs. Because when 01:59:59 PDT passes, the next trigger time of the cron job has been set to a time equal or later than 02:00:00 PST, so during 01:00:00 PST to 01:59:59 PST, no matched time will be found.

Predefined scheduling definitions

EasyCron supports the following macros:

Entry Description Equivalent to
@yearly (or @annually) Run once a year at midnight of 1 January 0 0 1 1 * *
@monthly Run once a month at midnight of the first day of the month 0 0 1 * * *
@weekly Run once a week at midnight on Sunday morning 0 0 * * 0 *
@daily Run once a day at midnight 0 0 * * * *
@hourly Run once an hour at the beginning of the hour 0 * * * * *

Exceptional case:

While normally the job is executed when the time/date specification fields all match the current time and date, there is one exception: if both "day of month" and "day of week" are restricted (that is, none of them is "*" or "?"), then either the "day of month" field or the "day of week" field matching the current day is adequate. The following table lists some Cron expression examples related to exceptional cases.

Cron Expression Meaning
0 0 * * 3 Fire at 00:00 AM (midnight) every Wednesday. Because only "day of week" is restricted as 3, the "day of month" is non-restricted (it's "*"), it doesn't belong to the exceptional case. So both "day of month" and "day of week" must match, therefore, only Wednesday matches.
0 0 ? * 3 Fire at 00:00 AM (midnight) every Wednesday. Because only "day of week" is restricted as 3, the "day of month" is non-restricted (it's "?"), it doesn't belong to the exceptional case. So both "day of month" and "day of week" must match, therefore, only Wednesday matches.
0 0 4 * ? Fire at 00:00 AM (midnight) on the 4th day of every month. Because only "day of week" is non-restricted (it's "?"), the "day of month" is restricted as 4, it doesn't belong to the exceptional case. So both "day of month" and "day of week" must match, therefore, only the 4th day of every month matches.
0 0 5 * 6 Fire at 00:00 AM (midnight) on the 5th day of every month AND every Saturday. Because both "day of month" and "day of week" are restricted (as 5 and 6 correspondingly), so it belongs to the exceptional case. That is, if either one of them matches, the "day" will be considered as matched.

If you have any question about cron expression, don't hesitate to contact us.