1 Ax.util.Cron.getNextExecutions
This method is useful to print in a calendar the execucions plan of programmed system tasks.
Returns a list with de dates of the following executions for a provided expression used to define the scheduler.
The number of dates that will be calculated it is defined by count attribute (by default 30).
Ax.util.Cron.getNextExecutions("5 15 10 * * ?"); Ax.util.Cron.getNextExecutions("5 15 10 * * ?", 10); // first 10 dates
1.1 Cron expressions
The expression that determines the scheduler.
Cron-Expressions are strings that are actually made up of seven sub-expressions, that describe individual details of the schedule. These sub-expression are separated with white-space, and represent:
Field | Allowed values | Allowed special characters |
---|---|---|
Seconds | 0-59 | , - * / |
Minutes | 0-59 | , - * / |
Hours | 0-23 | , - * / |
Day-of-Month | 1-31 | , - * ? / L W |
Month | 1-12 or JAN-DEC | , - * / |
Day-of-Week | 1-7 or SUN-SAT | , - * ? / L # |
Year (optional field) | empty, 1970-2199 | , - * / |
Individual sub-expressions can contain ranges and/or lists. For example, the day of week field in the previous (which reads “WED”) example could be replaced with “MON-FRI”, “MON,WED,FRI”, or even “MON-WED,SAT”.
Wild-cards (the ‘’ character) can be used to say “every” possible value of this field. Therefore the ‘’ character in the “Month” field of the previous example simply means “every month”. A ‘*’ in the Day-Of-Week
field would therefore obviously mean “every day of the week”.
All of the fields have a set of valid values that can be specified. These values should be fairly obvious - such as the numbers 0 to 59 for seconds and minutes, and the values 0 to 23 for hours. Day-of-Month can be any value 1-31, but you need to be careful about how many days are in a given month! Months can be specified as values between 0 and 11, or by using the strings JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC. Days-of-Week can be specified as values between 1 and 7 (1 = Sunday) or by using the strings SUN, MON, TUE, WED, THU, FRI and SAT.
The '*' character is used to specify all values. For example, "*" in the minute field means "every minute".
The '?' character is allowed for the day-of-month
and day-of-week
fields. It is used to specify 'no specific value'. This is useful when you need to specify something in one of the two fields, but not the other.
The '-' character is used to specify ranges For example "10-12" in the hour field means "the hours 10, 11 and 12".
The ',' character is used to specify additional values. For example "MON,WED,FRI" in the day-of-week
field means "the days Monday, Wednesday, and Friday".
The ‘/’ character can be used to specify increments to values. For example, if you put ‘0/15’ in the Minutes field, it means ‘every 15th minute of the hour, starting at minute zero’. If you used ‘3/20’ in the Minutes field, it would mean ‘every 20th minute of the hour, starting at minute three’ - or in other words it is the same as specifying ‘3,23,43’ in the Minutes field. Note the subtlety that “/35” does *not mean “every 35 minutes” - it mean “every 35th minute of the hour, starting at minute zero” - or in other words the same as specifying ‘0,35’.
The ‘L’ character is allowed for the day-of-month
and day-of-week
fields. This character is short-hand for “last”, but it has different meaning in each of the two fields. For example, the value “L” in the
day-of-month
field means “the last day of the month” - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week
field by itself, it simply means “7” or “SAT”. But if used in the
day-of-week
field after another value, it means “the last xxx day of the month” - for example “6L” or “FRIL” both mean “the last friday of the month”. You can also specify an offset from the last day of the month,
such as “L-3” which would mean the third-to-last day of the calendar month. When using the ‘L’ option, it is important not to specify lists, or ranges of values, as you’ll get confusing/unexpected results.
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 will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify "1W" as the value for day-of-month
, and the 1st is a Saturday,
the trigger will fire on Monday the 3rd, as it will not 'jump' over the boundary of a month's days. The 'W' character can only be specified when the day-of-month
is a single day, not a range or list of days.
The 'L' and 'W' characters can also be combined for the day-of-month
expression to yield 'LW', which translates to "last weekday of the month".
The '#' character is allowed for the day-of-week
field. This character is used to specify "the nth" XXX day of the month. For example, the value of "6#3" in the day-of-week
field means the third Friday of the month (day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of
the month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the given day-of-week
in the month, then no firing will occur that month. If the '#' character is used, there can only be one expression in the day-of-week
field ("3#1,6#3" is not valid, since there are two expressions).
1.2 Examples
Expression | Scheduler |
---|---|
0 0/5 * * * ? | An expression to create a trigger that simply fires every 5 minutes. |
0 30 10-13 ? * WED,FRI | An expression to create a trigger that fires at 10:30, 11:30, 12:30, and 13:30, on every Wednesday and Friday. |
0 0/30 8-9 5,20 * ? | An expression to create a trigger that fires every half hour between the hours of 8 am and 10 am on the 5th and 20th of every month. Note that the trigger will NOT fire at 10:00 am, just at 8:00, 8:30, 9:00 and 9:30. |
Note that some scheduling requirements are too complicated to express with a single trigger - such as “every 5 minutes between 9:00 am and 10:00 am, and every 20 minutes between 1:00 pm and 10:00 pm”. The solution in this scenario is to simply create two triggers, and register both of them to run the same job.
The expression generates a scheduler starting on the first day of december at 12 hour and runs every 15 minutes. The count number it is not define so the result shows the first 30 calculated dates.
Ax.util.Cron.getNextExecutions("5 /15 * * 12 ?").forEach(date => console.log(date));
01-12-2018 12:00:05
01-12-2018 12:15:05
01-12-2018 12:30:05
01-12-2018 12:45:05
01-12-2018 01:00:05
01-12-2018 01:15:05
01-12-2018 01:30:05
01-12-2018 01:45:05
01-12-2018 02:00:05
01-12-2018 02:15:05
01-12-2018 02:30:05
01-12-2018 02:45:05
01-12-2018 03:00:05
01-12-2018 03:15:05
01-12-2018 03:30:05
01-12-2018 03:45:05
01-12-2018 04:00:05
01-12-2018 04:15:05
01-12-2018 04:30:05
01-12-2018 04:45:05
01-12-2018 05:00:05
01-12-2018 05:15:05
01-12-2018 05:30:05
01-12-2018 05:45:05
01-12-2018 06:00:05
01-12-2018 06:15:05
01-12-2018 06:30:05
01-12-2018 06:45:05
01-12-2018 07:00:05
01-12-2018 07:15:05
The expression generates a scheduler that returns a plan to execute it every day (from now) on 10:15:05 time. As the count number is set to 10, only the first 10 calculated dates will be shown.
Ax.util.Cron.getNextExecutions("5 15 10 * * ?", 10).forEach(date => console.log(date));
[The sample is executed on 27-06-2018 16:14:34]
28-06-2018 10:15:05
29-06-2018 10:15:05
30-06-2018 10:15:05
01-07-2018 10:15:05
02-07-2018 10:15:05
03-07-2018 10:15:05
04-07-2018 10:15:05
05-07-2018 10:15:05
06-07-2018 10:15:05
07-07-2018 10:15:05