Skip to content
Marvin's Toolbox.

systemd Timer Tester

Paste an OnCalendar expression to see its normalized form and its next run times in any time zone, just like systemd-analyze calendar. Convert it to and from cron, and generate matching .timer and .service units.

Runs entirely in your browser. Nothing you put in here gets uploaded.

Weekday, date, time and zone, each of them optional. Pasting a whole OnCalendar= line works too.

Normalized form

Mon..Fri *-*-* 09:00:00

WeekdayYearMonthDayHourMinuteSecond

In plain words

At 09:00 on Monday through Friday

Next run
…
Typical gap
…
needs at least two upcoming runs

Field by field

Mon..FriWeekday

Only on Monday through Friday

*Year

Every year

*Month

Every month

*Day

Every day that passes the weekday check

09Hour

Hour 9

00Minute

Minute 0

00Second

Second 0

Upcoming runs

Working out the next runs…

Cron

Cron line, same schedule

0 9 * * 1-5

Nothing was lost, this line fires at the same times.

Unit files

Leave empty to run as root.

Spreads the start over this span, so a fleet does not fire at once.

How late systemd may fire to batch wakeups. The default is 1min.

Catch up on a run missed while the machine was off.
Wake the machine from suspend for the run.

Syntax

Next steps

Keep going. These tools open with your result loaded in.

Convert text into every case at once: title case in the APA, AP, Chicago, MLA, Bluebook, AMA and NYT styles, sentence case, upper, lower, camelCase, snake_case, kebab-case and more.

Count words, characters, sentences, paragraphs, lines and more as you type, with estimated reading and speaking time.

Remove duplicate lines from a list or text, keeping the first occurrence. Optionally ignore case and whitespace, or drop blank lines too.

Replace text in two modes: plain find and replace all, or regular expressions with flag controls and capture group references like $1.

Compare two texts and see every added, removed and changed line highlighted, side by side or inline, with the changed words marked within each line. Ignore case, whitespace or blank lines, read a summary of how much changed, and export the result as a unified diff.

Paste a UUID to see what it carries: version, variant, and for time-based versions the exact timestamp, clock sequence and node. Also shows the raw bytes, the 128-bit integer and the URN form.

Decode Base64 to text or encode text to Base64. Paste into the top box, read the result below, and flip the direction with one click. Handles Unicode correctly, reads URL-safe Base64, and shows binary payloads as a hex dump you can download.

Convert numbers between binary, octal, decimal, hexadecimal and any base up to 36. Type into any field and the others update as you go. Handles huge integers without losing precision and accepts 0x, 0b and 0o prefixes.

Convert between scientific notation and full numbers as you type. Reads 1.23e5, 1.23 × 10^5 and plain numbers, shows the value written out, in normalized scientific notation and in engineering notation, and can round to any number of significant digits.

About the systemd Timer Tester Tool

This tool tests a systemd OnCalendar expression the way systemd-analyze calendar does. Paste something like Mon..Fri 09:00 and you get the normalized form exactly as systemd prints it, the meaning in plain English, a field by field breakdown and the next runs with a relative readout such as in 3 hours. Every field keeps one color from the characters you type to the words in the summary.

The parser and the elapse calculation are ported line by line from systemd's own calendarspec.c, so the tool accepts and rejects what systemd does, and its run times hold up across daylight saving changes and leap years. It also converts schedules to and from cron, and writes a matching .timer and .service pair.

What you can do

  • Normalize an OnCalendar expression without a Linux machine at hand
  • List the next runs of a systemd timer in any time zone
  • Check what a timer does around daylight saving changes
  • Find out why a calendar expression never fires
  • Convert a crontab line to a systemd timer
  • Convert a systemd timer to cron and see what cannot carry over
  • Generate a .timer and .service unit pair with Persistent, RandomizedDelaySec, AccuracySec and WakeSystem
  • Fix syntax mistakes with errors that name the field and the value

How to use the systemd Timer Tester

  1. 1Type or paste a calendar expression, a whole OnCalendar= line, or pick one of the examples.
  2. 2Compare the normalized form and the plain English sentence with what you meant.
  3. 3Pick the time zone of the machine and read through the upcoming runs.
  4. 4Convert the schedule to cron if you need it there, or paste a crontab line to go the other way.
  5. 5Fill in the unit settings, then copy or download the .timer and .service files.

How a calendar expression is built

The full form is weekday year-month-day hour:minute:second zone, and every part is optional. A missing date means *-*-*, a missing time means 00:00:00, and missing seconds mean :00. So Mon 12:00 normalizes to Mon *-*-* 12:00:00.

Each date and time field takes *, a value, a comma list, a range with two dots like 9..17, or a repetition like 0/15, which means that value and then every 15 after it. Weekdays take names and ranges like Mon..Fri, seconds may hold fractions, and the zone at the end is UTC or any IANA name like Europe/Berlin. A ~ in place of the last dash counts from the end of the month, so *-02~03 is the third last day of February and Mon *-05~07/1 is the last Monday in May.

Words like minutely, hourly, daily, weekly, monthly, quarterly, semiannually and yearly are shorthands for full expressions.

Daylight saving and impossible dates

systemd matches the wall clock of the zone, so a time skipped by the spring clock change does not fire that day, and a time repeated in autumn fires once. Rows where the clocks change between two runs carry a marker.

A date like *-02-30 is valid syntax that can never come true, and Thu 2027-01-01 asks for a Thursday on a Friday. The tool tells these apart from expressions whose dates have simply passed, and it warns about the rare expressions on which systemd's search gives up.

Timers compared with cron

Cron has no seconds, no years, no month-end days and no zone per schedule, so the converter flags each of those instead of dropping them quietly. The bigger trap is the day fields: with both a day and a weekday, cron fires when either one matches, while systemd requires both. Going from cron to systemd, such a line becomes two OnCalendar= lines on the same timer.

To explain a cron line in detail, use the Cron Expression Explainer, and to assemble one field by field, use the Cron Expression Builder.

Tools that share a tag with this one.

Convert config and data between JSON, YAML, TOML, JSON5, INI, XML, CSV and .env. Type or paste on the left, pick the output format on the right, and copy the result. Includes a format button and a minify toggle.

Turn docker run commands into a docker-compose.yml, or a compose file back into docker run. Ports, volumes, environment variables, networks, restart policies and resource limits carry over.

Build a complete WireGuard setup: one server and as many peers as you need. Keys, preshared keys and tunnel addresses are filled in for you, with full or split tunnel routing, DNS, NAT rules, a QR code per peer and a zip of every config.

Decode any DER or PEM data into a browsable ASN.1 tree with named object identifiers and a linked hex view. Open PKCS#12 .p12 and .pfx bundles with their password to list the certificates and keys inside, and export them as PEM.

Enter a resolution to get its simplified aspect ratio, or start from a ratio and one side to get the missing dimension. Knows the common ratios like 16:9, 4:3 and 21:9 and shows how close your size is to each.

Create barcodes in dozens of formats, from EAN-13, UPC-A and Code 128 to QR Code, Data Matrix and PDF417. Type the content, tune the size, colors and text options, and download the result as PNG or SVG.