Cron Expression Parser
See 0 */6 * * 1-5 as the dates it will actually run, and what each field allows.
Output
Paste or type above to see the result here.
Your files stay on your device
This tool runs entirely in your browser. What you paste is processed on your device and is never sent to a server, so it is safe to use with tokens, keys and unpublished text.
Example
Example: 0 9 1-7 * MON is not “the first Monday of the month”
A team wants a monthly report at 9 am on the first Monday. The obvious expression is 0 9 1-7 * MON: minute 0, hour 9, days 1 to 7, any month, Monday. The list always starts from now; the dates here were worked out from Friday 29 May 2026, with 12 runs.
- The list does not show one Monday a month. It shows Monday, June 1, then Tuesday 2 through Sunday 7 June, then the Mondays 8, 15, 22 and 29 June, then Wednesday, July 1.
- The fields under the list say why: day of month 1,2,3,4,5,6,7 and day of week 1. When both are restricted, cron runs when either one matches, not both.
- Cron alone cannot say “first Monday”. The usual way is 0 9 1-7 * * with a test in the command: [ "$(date +\%u)" = 1 ] && ./report.sh — the % has to be escaped in a crontab.
- 0 9 1-7 * * on its own lists 1 to 7 June at 9:00 AM, then July 1; the weekday test lets only Monday, June 1 through.
| Expression | Next runs from Friday 29 May 2026, 12:00 PM | Why |
|---|---|---|
| 0 9 1-7 * MON | Jun 1, 2, 3, 4, 5, 6, 7, 8, 15, 22, 29, Jul 1 | days 1–7 or any Monday |
| 0 9 1-7 * * | Jun 1 to 7, then Jul 1 | days 1–7 only |
| 0 0 1 * MON | Jun 1, 8, 15, 22, 29, then Wed Jul 1 | the 1st or any Monday |
| */15 9-17 * * MON-FRI | Fri 12:15, 12:30, 12:45 PM …, last at 5:45 PM | 9-17 includes the 17:00 hour |
| 0 0 31 2 * | // next 0 runs | 31 February never comes |
| 0 12 * * ? * | every day at 12:00 PM, from Sat May 30 | ? and a year last: read the AWS way, minute first |
Reading dates instead of fields is what catches it: 12 runs in five weeks where one a month was meant. The times are in your browser’s time zone, named at the top of the list; a server that runs cron in UTC needs the hour shifted.
How it works
- Paste a five-field cron expression: minute, hour, day of month, month, day of week. For example 30 2 * * 0 runs at 02:30 every Sunday.
- Choose how many upcoming run times you want to see, from 1 to 20.
- The result appears as you type. You get the run times as full dates, such as "Sunday, October 25, 2026 at 2:30 AM", and under them each field spelled out as the values it allows.
- Compare the dates with what you intended. Off-by-one mistakes in day-of-week or step values show up immediately in the list.
Frequently asked questions
- Which time zone are the next run times in?
- They are calculated in your browser's local time zone, the one shown in your operating system settings. Servers usually run cron in UTC or the machine's configured zone, so shift the results accordingly when you compare them to a production schedule.
- What syntax is supported?
- The standard five fields with * for any value, comma lists (1,15), ranges (1-5), step values (*/10 or 1-30/5) and three-letter names for months (JAN-DEC) and weekdays (SUN-SAT). Both 0 and 7 mean Sunday. The special strings @hourly, @daily, @weekly, @monthly and @yearly are expanded to their five-field equivalents.
- How are day-of-month and day-of-week combined?
- As in Vixie cron: if both fields are restricted (neither is *), the job runs when either one matches, not both. So 0 0 1 * MON runs on the 1st of every month and on every Monday. This surprises many people, so check the list of next runs.
- Does it support seconds or the year field?
- A six-field expression is read the way Quartz and Spring write it, seconds first: the seconds are dropped and the runs are worked out from the other five, so 0 0 12 * * ? runs every day at 12:00 PM (? is read as *). The exception is the AWS EventBridge form, minute first and a year last, told apart by the ? in the day of month or the day of week: 0 12 * * ? * also runs every day at 12:00 PM, and the year is listed under the other fields. A seventh field after Quartz's six is read as the year.
- Why does my expression show no runs?
- The tool looks about five years ahead. A date that never comes — 0 0 31 2 * is 31 February, 0 0 30 2 * the 30th — leaves the list empty, and the header reads // next 0 runs. The fields under it show what was read, so a typo in a range is easy to spot.
- How do I run a job on the first Monday of the month?
- Not with the day fields alone: 0 9 1-7 * MON runs on days 1 to 7 and on every Monday. Use 0 9 1-7 * * and let the command check the weekday, for example [ "$(date +\%u)" = 1 ] && ./job.sh, with the % escaped as a crontab requires.
- Is the expression sent to a server?
- No. Parsing and date calculation happen in your browser. There is nothing to upload and nothing to log.
Related tools
▤ Timestamp Converter Paste an epoch value or a date and see it in UTC, local time and ISO 8601. • UUID Generator Create UUID v4 or v7 identifiers in bulk, generated on your device with a secure random source. • Regex Tester Type a pattern, paste some text, and see every match and capture group as you go. {} JSON Formatter Paste JSON, get it indented, minified or validated instantly. Your data stays on this page.