A little help goes a long way. Find a tool/

Developer FIELD NOTES · 4 MIN READ

Predicting Cron Run Times: From Expression to Timestamps

How a cron expression becomes concrete fire times: the minute-scan walk, UTC output, day-field subtleties, and catching impossible schedules.

You inherit a server job scheduled with */15 9-17 * * 1-5. The syntax checks out, but a question remains: when, exactly, does it fire? A cron expression is a description, not a date — this article walks through how a calculator turns that description into concrete timestamps, and the details that quietly change the answer.

From expression to timestamps

The conversion is a scan, not a formula. The five fields — minute, hour, day-of-month, month, weekday — are each parsed into a set of allowed values: * allows everything, 9-17 a range, */15 every 15th value, and comma lists like 1,15 combine picks. The calculator then starts one minute after your reference time and steps forward minute by minute, keeping every moment where all five sets match at once, until it has the next N hits.

Worked example: */15 9-17 * * 1-5 from Monday 2026-10-26 10:07 UTC. The minute set is every 15th minute, the hour set is 9 through 17, and weekdays are Monday through Friday. The next matching instants:

2026-10-26T10:15:00Z
2026-10-26T10:30:00Z
2026-10-26T10:45:00Z
2026-10-26T11:00:00Z

Notice the first run is 10:15, not 10:07 — the reference time itself never counts, because a schedule fires at matching minutes, and 10:07 is not one of them.

Everything is computed in UTC

The output timestamps are UTC, on purpose. Servers mostly run cron in UTC (or behave inconsistently across daylight-saving shifts otherwise), so a predictable common ground avoids the classic "it ran an hour early in March" mystery. 0 9 * * 1-5 evaluated from a Saturday becomes 2026-10-26T09:00:00Z — Monday morning, nine o'clock, UTC. If your machine or scheduler runs in local time, translate before comparing: that 09:00 UTC is 05:00 in New York in October but 04:00 during standard-time months. When in doubt, check what your crontab's CRON_TZ or system zone actually is.

The day-of-month and day-of-week subtlety

One field pairing deserves special care. Classic Vixie cron treats a restricted day-of-month and a restricted day-of-week with an OR: 0 0 1 * 1 means "the 1st or any Monday". This calculator instead requires both fields to match. Run 0 0 1 * 1 and the results are 2027-02-01 and 2027-03-01 — the first dates that are simultaneously the 1st of a month and a Monday. Neither interpretation is "wrong"; they are different conventions, and the mismatch is a real source of surprise when you verify a production schedule. The (much deeper) grammar behind these fields lives in How Cron Expressions Work.

Broken schedules announce themselves

Ask for the next run of 0 0 30 2 * — 00:30 on February 30th — and no date ever matches. The calculator scans up to two years of minutes per requested run and then reports that it could not find enough runs, which is exactly the diagnosis you want before a job silently never fires. The same scan exposes subtler traps: 0 0 29 2 * matches only in leap years, so the next hit is 2028-02-29, and a comma list like 30 4 1,15 * * correctly yields the 1st and 15th of each month at 04:30 UTC (Nov 1, Nov 15, Dec 1…). Weekdays accept both 0 and 7 for Sunday, so * * * * 7 behaves identically to * * * * 0.

Why predicting beats guessing

Reading an expression in your head works for simple cases and fails exactly when it matters: overlapping ranges, weekday windows, month boundaries. Generating the next N timestamps turns a hunch into a list you can diff against expectations — before the deploy, not after the 3 a.m. page. It also doubles as documentation: a schedule expressed as "Nov 1, Nov 15 at 04:30 UTC" is far harder to misread than its five fields.

Try it yourself

Project any five-field expression into real timestamps with the Cron Next Run Calculator — start with */15 9-17 * * 1-5 and check the first hit lands on a 15-minute boundary. Building an expression from a plain-English schedule is the reverse direction, covered by the Cron Expression Generator. To translate UTC results into your own wall-clock time, the Time Zone Converter does the offset math for you.

Frequently asked questions

How is this different from a cron expression generator?
Direction. A generator translates a human description — "every 15 minutes on weekdays" — into a cron expression. This calculator does the opposite: it parses an existing expression and projects the actual timestamps it will fire. Using both together, you can build an expression and then verify it produces the schedule you meant.
Why are the results in UTC?
Determinism and convention. Most servers run cron in UTC, and fixed UTC timestamps cannot drift when daylight saving shifts your local clock. Treat the output as the server's view of time, then convert to your own zone for the wall-clock reading.
My job fires at a different time than predicted — why?
The usual suspects are a timezone mismatch between the tool's UTC and your scheduler's zone, the day-field convention (this tool requires day-of-month and day-of-week to both match, while Vixie cron ORs them when both are restricted), and six-field cron dialects like Quartz that add a seconds column and shift every field.
What happens to a schedule that never occurs?
It scans roughly two years of minutes per requested run and then reports that it could not find enough runs. A February 30th schedule, for example, can never match — which turns a silent production bug into an immediate, visible error.
How far ahead can it predict?
Up to about two years ahead per requested run, and you can request 1 to 50 run times at once. That is enough to spot pattern errors like a job that only fires on months whose 1st falls on the weekday you restricted to.