ForHosting KIT · Data & Files

Convert a cron schedule to a readable list of upcoming run times

*/20 9-10 * * 1-5, starting after 09:05 UTC on 27 July 2026, runs at 09:20, 09:40, 10:00 and 10:20. Paste a cron expression, a start time and how many runs you want to see the exact upcoming times. Free in your browser.

  • Free
  • Runs in your browser
  • No sign-up
  • Your data stays on your device
Use it from WebAPIEmailTelegramApp soon
If you enter
Cron
*/20 9-10 * * 1-5
Quantity
4
Start time
2026-07-27T09:05:00Z
You get
Run times
2026-07-27T09:20:00Z, 2026-07-27T09:40:00Z, 2026-07-27T10:00:00Z, 2026-07-27T10:20:00Z

A cron expression is compact, but compact syntax is not always easy to review. This capability turns a standard five-field cron expression into a concrete list of upcoming UTC timestamps, beginning strictly after the start time you provide. Choose how many occurrences you need and receive exact ISO 8601 values that can be copied into tests, runbooks, tickets, or deployment reviews. Malformed fields are rejected with a clear input error instead of producing a plausible but incorrect schedule.

Turn compact cron syntax into dates you can inspect

A five-field cron expression describes minutes, hours, days of the month, months, and days of the week. That notation is efficient for machines, yet reviewers often need to see actual dates before they trust a schedule. Provide the expression, an exclusive ISO 8601 UTC start time, and a count from 1 through 100.

The result repeats the normalized request and returns the next matching instants as a readable array of timestamps ending in Z. The start is exclusive: if it is exactly 09:00 and the expression runs at 09:00, the first result will be the following matching occurrence. Cron has one-minute resolution, so every returned timestamp has zero seconds.

Lists, inclusive ranges, wildcards, and positive steps are supported in every field. For example, a minute field of */15 selects four points per hour, while 9-17/2 selects every second hour inside that range. Numeric day-of-week values use Sunday as either 0 or 7.

Understand the calendar rules behind the result

All calculations use the proleptic Gregorian calendar and UTC. Requiring a Z timestamp avoids a hidden timezone conversion that could move a run across a date boundary or daylight-saving transition. Month lengths and leap years are calculated directly, including the century rule: years divisible by 100 are not leap years unless they are also divisible by 400.

Day-of-week matching follows conventional cron behavior. When either day-of-month or day-of-week is a wildcard, the restricted field controls the match. When both fields are restricted, a date matches if either field matches.

This detail matters for expressions such as 0 9 1 * 1, which means 09:00 on the first day of each month and also on Mondays; it does not mean only first-of-the-month Mondays. Returned occurrences are ordered chronologically and are generated with deterministic integer calendar arithmetic.

Validate schedules before they reach production

Use the list as a small, concrete acceptance test for automation. The parser rejects expressions that do not contain exactly five fields. It also rejects empty list members, reversed ranges, zero or malformed steps, and numbers outside each field's allowed range.

The accepted ranges are 0–59 for minutes, 0–23 for hours, 1–31 for days of the month, 1–12 for months, and 0–7 for days of the week. This capability intentionally does not accept named months, named weekdays, seconds fields, year fields, macros such as @daily, or implementation-specific extensions. Those constructs vary among cron engines, so silently guessing their meaning would undermine the purpose of a schedule preview.

Review a deployment schedule

Expand a proposed cron string into exact UTC dates before approving a scheduled production task.

Prepare an operations runbook

List upcoming maintenance or reporting times in a format that can be copied directly into operational documentation.

What cron format is supported?

Wildcards, lists, ranges, and positive steps are supported.

Is the start time included?

No. The start time is exclusive, so a run exactly equal to it is skipped and the next matching occurrence is returned.

Which timezone is used?

UTC only. Supply an ISO 8601 timestamp ending in Z, and every returned timestamp also ends in Z.

How are day-of-month and day-of-week combined?

If both are restricted, matching either one selects the date. If one is a wildcard, the other field controls the date match.

What does */15 mean in a cron schedule?

It means every 15 minutes, which gives four runs per hour. Steps also work on ranges: 9-17/2 in the hour position selects every second hour between 9:00 and 17:00.

Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.

POSThttps://api.kit.forhosting.com/data/cron-to-readable

Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.

curl -X POST https://api.kit.forhosting.com/data/cron-to-readable \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"cron":"*/20 9-10 * * 1-5","count":4,"start_time":"2026-07-27T09:05:00Z"}'
{
  "cron": "*/20 9-10 * * 1-5",
  "count": 4,
  "start_time": "2026-07-27T09:05:00Z"
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "data.cron_to_readable",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

max_count100
HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

Understand the calendar rules behind the result

The same input therefore yields the same output regardless of the machine, local timezone, current clock, or locale running the request.

Validate schedules before they reach production

API automation costs $0.002 per request, while the algorithm itself uses no network or external service.

Create scheduler test fixtures

Generate stable expected timestamps for unit and integration tests without depending on the current clock.

What happens when a cron field is malformed?

The request fails with an invalid_input error that identifies the malformed field or invalid range.

What does an API request cost?

Each API request costs $0.002. The deterministic calculation uses no network, storage, or external model.

Read the full KIT documentation →