Skip to content

🗣️ Crontab → Human

Translate any 5-field or 6-field (with seconds) cron expression into a clear natural-language description, plus the next 5 execution times.

100% Free No signup Browser-only 5 languages Dark mode
🔒 Privacy guaranteed: Cron expressions are never uploaded. All parsing and description happen entirely inside your browser.

Natural language description

Next 5 runs

    Quick examples

    📖 Where people get stuck

    Translate a cron expression into plain language. It understands both the five-field form (minute, hour, day of month, month, day of week) and the six-field form with seconds in front. Being able to read the expression is a separate question from whether it will run once written into a crontab: the crontab file format has quirks of its own that have nothing to do with the expression, and those trip people up at least as often. To check the meaning and the next run times, see the cron expression parser.

    Case What happens What to do
    A % in the command breaks the job In a crontab, % means newline. Everything up to the first % is the command and everything after it is fed in on standard input. So date +%Y%m%d actually runs date + and hands the rest to it as input. Everyone hits this exactly once, usually while trying to put a date in a log filename. Escape every % with a backslash: date +\%Y\%m\%d. The same applies to printf formats and to any command containing percent-encoding. Once the escaping makes the line unreadable, move the work into a shell script and have the crontab call only that — inside the script a % is just a character.
    Only the last line never runs A crontab file must end with a newline. Without it, some implementations simply skip the final line. Editing with crontab -e gets you one automatically, but piping a file in with crontab < file, or writing it from a deployment script, is on you. Nothing errors and nothing warns, which makes this a hard failure to trace. Append printf "\n" at the end of your generator, or read it back with crontab -l and count the lines. Note also that files placed in /etc/cron.d/ use a different format: they carry an extra field for the user after the time fields (0 3 * * * root /path/to/job). Omit the username and cron tries to run the username as the command.
    The next run starts before the last one finished Cron never checks whether the previous run finished. Set it every five minutes and let the work grow to seven, and two or more copies are always running — and the overlap compounds as the data grows. Database lock contention, two writers on the same file and blowing an external rate limit all arrive this way. It breaks suddenly one day as volume grows, which is what makes it hard to attribute. Take an exclusive lock with flock: * * * * * /usr/bin/flock -n /tmp/myjob.lock /path/to/job exits immediately while a previous run holds the lock, thanks to -n (use -w seconds if you would rather wait). Alongside that, log the runtime of the job and monitor it — crossing 50 % of the interval is your signal to revisit the design.

    The six-field form with seconds is not standard cron. Quartz, node-cron and Spring @Scheduled each extended the syntax on their own, and a Linux crontab will reject it. This page reads both, but whether the thing that will actually run it accepts one is a question for that implementation documentation. Shorthands such as @daily and @reboot are the incompatibility in the other direction: valid in a crontab, unknown to many libraries. Assume that the same expression can mean different things in different runners.

    📖 How to Use

    1. 1
      Enter a cron expression
      Paste or type a 5- or 6-field cron expression into the input box.
    2. 2
      Read the description
      A natural-language description and the next 5 execution times appear instantly as you type.
    3. 3
      Try the quick examples
      Click any quick example below to instantly load common patterns into the input.

    ❓ Frequently Asked Questions

    What is the difference between 5- and 6-field cron?
    The 5-field format is standard Unix (minute hour day month weekday). The 6-field format adds a leading seconds field (second minute hour day month weekday) and is used by Quartz, Spring, and similar schedulers.
    How is this different from the Cron Visualizer?
    This tool focuses on natural-language descriptions in five languages with readable phrasing. The visualizer focuses on timetables and graphical hints.
    Can I use aliases like @daily?
    @yearly, @annually, @monthly, @weekly, @daily, @midnight and @hourly are all supported.
    🐛 Found a bug or issue with this tool?

    Free to use, no signup. Even just the steps to reproduce are helpful. Reports go directly to the operator and help us fix issues.

    * Browser info (UA / screen / language / URL) is sent automatically to help reproduce the issue