Go REST

Cron expression builder and parser

Parse a Unix cron expression and see the next 10 times it fires. Use the preset buttons or write your own; the description and fire-time list update live.

Minute
0-59
Hour
0-23
Day of month
1-31
Month
1-12
Day of week
0-6 (Sun-Sat)

Description

Next 10 fire times (local)

    Next 10 fire times (UTC)

      What is a cron expression?

      A cron expression is a five-token string that describes a repeating schedule. The tokens, left to right, are: minute (0-59), hour (0-23), day-of-month (1-31), month (1-12), and day-of-week (0-6, with 0 or 7 meaning Sunday). Each token can be a single value, a comma-separated list, a range, a step, or the wildcard *.

      The format dates back to the 1970s Unix cron daemon. It's terse, expressive, and surprisingly easy to misread - which is why a parser-and-fire-time tool is useful even after you've written hundreds of them.

      When to use this tool

      • Authoring a new schedule.Write the expression, watch the next 10 fire times update. If "weekdays at 9am" shows up firing on Saturday, you missed something.
      • Decoding a third-party expression.The vendor docs say 30 2 * * 1,5. The description here translates: "at 02:30 on Mondays and Fridays."
      • Sanity-checking a deploy schedule."Daily cleanup at midnight" is easy to claim and hard to verify. The UTC column matters when your servers run in UTC and your humans don't.

      The five fields, in detail

      • Minute (0-59).0 means top of the hour. */15 means every 15 minutes starting at minute 0.
      • Hour (0-23).Always in the cron daemon's local time zone (usually UTC for cloud schedulers).
      • Day-of-month (1-31).Days that don't exist in the current month (e.g. February 30) are silently skipped.
      • Month (1-12).Names jan through dec are accepted as aliases.
      • Day-of-week (0-6).0 = Sunday. Names sun through sat work too. 7 is accepted as an alias for Sunday.

      The trick with day-of-month and day-of-week

      When both day-of-month and day-of-week are restricted, standard cron fires when EITHER matches, not both. 0 0 13 * 5 ("midnight on the 13th OR on Fridays") fires more often than people expect. To get an AND ("the 13th when it's a Friday"), you typically need a script check, not a cron expression.

      Common pitfalls

      • Time zones.Most schedulers run in UTC. "Daily at 9am" written as 0 9 * * * fires at 9am UTC, which is 2am Pacific or 2:30pm IST. The local / UTC columns here help you confirm.
      • Lists vs ranges.1,2,3,4,5 is the same as 1-5. Use the range form for readability; both work.
      • Steps without a range.*/15 is fine; some daemons silently reject */15 in the day-of-month field above 28. This tool accepts the spec literally.
      • Quartz-style 6 or 7 fields.Java schedulers (Spring, Quartz) often prepend a seconds field, making 6 fields total, and may append a year. This tool is 5-field only; if you have 6, drop the leading seconds.
      • Fugit / Solid Queue prose syntax.Strings like "every hour at minute 12" are not cron. They are Fugit syntax used by Ruby's Solid Queue. This tool will reject them; the recurring.yml file is the source of truth.