---
title: "Cron Expression Tool"
description: "Decode any 5-field cron expression into plain English with the next 5 run times — or describe a schedule in words and get the cron back."
url: "https://freshjuice.dev/tools/cron-expression/"
---
## About this tool

Paste a cron expression to see what it actually means and when it will fire next (computed in your local time zone). Or flip it: type "every weekday at 9am" and get `0 9 * * 1-5` back.

## The five fields

```
┌───────────── minute (0–59)
│ ┌───────────── hour (0–23)
│ │ ┌───────────── day of month (1–31)
│ │ │ ┌───────────── month (1–12)
│ │ │ │ ┌───────────── day of week (0–7, Sun=0 or 7)
* * * * *
```

Quirk worth knowing: when both day-of-month and day-of-week are restricted, unix cron fires when *either* matches (OR, not AND). This tool follows that rule for next-run calculation.

## Frequently Asked Questions

### What does the five-field cron syntax mean?

Left to right: minute (0-59), hour (0-23), day of month (1-31), month (1-12), day of week (0-7, where both 0 and 7 are Sunday). `0 9 * * 1-5` reads "minute 0, hour 9, every day of month, every month, Monday through Friday": 9am on weekdays. Each field accepts single values, ranges (`1-5`), steps (`*/15`, every 15), and comma-separated lists (`1,15`).

### Why is my cron expression firing on the wrong day?

Classic unix gotcha: when *both* day-of-month and day-of-week are restricted (not `*`), cron fires when *either* matches. An OR, not an AND. `0 0 1 * 1` runs on the 1st of the month *and* every Monday, not "first Monday". To get the first Monday, restrict one field and test the other inside your script. This tool follows the OR rule for next-run calculation.

### What time zone are the next run times shown in?

Your browser's local time zone, the same zone your `crontab` uses if the server runs in local time. But note: most production servers run UTC, and cloud schedulers (AWS EventBridge, Kubernetes CronJobs) often default to UTC too. A job set for "9am" on a UTC server in local-time thinking fires at a very different hour. Check the zone before you trust the times.

### Does it support @hourly, @daily, or seconds?

No on both counts. This tool handles standard five-field unix cron: no `@` shortcuts, no sixth seconds field (those are Quartz or Vixie cron extensions, not standard). For "every hour at minute 0", write `0 * * * *`. For sub-minute scheduling, cron is the wrong tool.

### How does the plain-English to cron direction work?

Type a schedule description like "every weekday at 9am" or "every 15 minutes" and the parser maps it to the matching five-field expression. It covers the common patterns (times, intervals, weekday/weekend distinctions) and shows you what it produced so you can sanity-check before committing it to a crontab. For exotic schedules, write the expression directly.

### Can cron express the last day of the month?

Not directly. Standard cron has no "last" keyword. The common workaround is `59 23 28-31 * *` plus an in-script check that today is actually the last day (skip the run if tomorrow starts a new month). Kubernetes CronJobs added `L` for this, but classic crontab doesn't support it.
