systemd Timer: OnCalendar Parser and Unit Generator
WebEverything runs locally in your browser — nothing is uploaded
`OnCalendar=` looks like cron but does not behave like it, and the differences hide in the details. `a/b` is a step (`*:0/15` means the 0th, 15th, 30th and 45th minute of every hour), `~N` counts back from the end of the month, and weekdays and months may be written as names. The one that catches people out most: when a weekday and a date are both given the match is AND, not OR — the opposite of cron. This tool computes the next few run times in the time zone you pick (showing both local time and UTC), explains the expression segment by segment, and generates a matching .timer and .service. Parsing and arithmetic happen entirely in your browser, using the platform date capabilities for the time-zone maths. Nothing is sent anywhere.
Features
- Parses *, a..b ranges, a/b steps, named weekdays and months, and ~ (back from month end)
- Computes the next 1–20 run times in the chosen time zone
- Shows each run as local time with its offset and as UTC
- Explains what the weekday, date and time segments each mean
- Generates a matching .timer and .service pair
- Accepts a whole pasted .timer file as well as a bare expression
- Calls out the AND-versus-OR difference between systemd and cron
- Runs entirely locally, with no network requests
How to use
- Enter an OnCalendar value, or paste a whole .timer file
- Pick a time zone and how many runs to list
- Read the upcoming run times and the segment-by-segment explanation
- Copy the generated .timer and .service
FAQ
- How is OnCalendar different from cron?
- Two key differences. First, when a weekday and a date are both set, cron uses OR while systemd uses AND: cron `0 9 * * 1` is every Monday at 09:00, whereas systemd `Mon *-*-01 09:00` is "a Monday that is also the 1st", which happens only a few times a year. Second, systemd lets you write several `OnCalendar=` lines to trigger one unit (that is its OR), and accepts named weekdays and months, which reads far better.
- What does *:0/15 mean?
- It means the 0th, 15th, 30th and 45th minute of every hour. Read `0/15` as start at 0, step by 15, run up to the maximum of the field (59 for minutes), which yields 0, 15, 30 and 45. Reading `0/15` as "0 to 0" leaves only 0 — no error, but entirely wrong.
- Why does the time zone change the result?
- Because `OnCalendar=` is evaluated in local time. The same `*-*-* 03:00:00` is 03:00 UTC on a UTC machine and 19:00 UTC (the previous day) on a Shanghai machine. So this tool makes the zone explicit and shows both the local time and UTC — check a machine's zone before moving a unit file onto it.
- What does `~` mean?
- It means a day counted back from the end of the month. `*-*-~1` is the last day of each month and `*-02-~03` is the third-last day of February — and it tracks the month length automatically (in a leap year February has 29 days, so the third-last is the 27th). That is far more reliable than hard-coding 28.
- Why does a .timer need a .service?
- Because in systemd the timer only decides when to fire; what to run is defined in the service. They usually share a name (`backup.timer` fires `backup.service`), and `Unit=` can point at a different one. This tool produces a working skeleton for both — you will want to replace `ExecStart=` with your own command.
Related tools
Config Validator
WebCheck a package.json, .env, robots.txt, sitemap.xml or HTTP headers. Findings come in three levels — errors, warnings, suggestions — each with a reason.
Compose ↔ docker run
WebConvert both ways between compose services and docker run. Keys without an equivalent are listed with the reason, never silently dropped.
Linux Permissions
WebConvert between 755, u+x,g-w and -rwxr-xr-x, with every bit explained and the umask defaults for new files and directories worked out. All in your browser.
URL Parser
WebParse a URL into scheme, host, port, path, query parameters and fragment, with each parameter shown raw and decoded. Runs entirely in your browser.
User-Agent Parser
WebParse a user agent into browser, version, OS, device type and engine, and see which rules matched. Pattern matching only. Runs entirely in your browser.
HTTP Status Codes
WebLook up an HTTP status code for its meaning, 1xx–5xx class, typical uses and common traps. Runs entirely in your browser.