Cron Atlas

Cron expression for every 90 minutes

0 */3 * * *
30 1-23/3 * * *

Every 90 minutes, counted from midnight.

Next 10 runs

In Cron, worked out in your browser from the current time.

At a glance

Runs
16 a day
Gap between runs
Always 1 hour 30 minutes
Expressible in
All six dialects
Clock changes
Affected in New York, London, Helsinki

Open in the tester

In each dialect

Every expression here is generated by the tester’s own engine and checked run for run against the others, so “Exact” means the same clock times in the same zone. Each one links to the tester.

0 */3 * * * /path/to/command
30 1-23/3 * * * /path/to/command
  • Add all 2 lines to the crontab.
Needs 2 schedules
aws events put-rule --name every-90-minutes --schedule-expression "cron(0 0/3 * * ? *)"
aws events put-rule --name every-90-minutes --schedule-expression "cron(30 1/3 * * ? *)"
  • Wrap it in cron(…). Day of week is ? because day of month already holds *, and a * in both is rejected. The final * is the required year field.
  • Create one rule per expression, each with the same target. A single rate(90 minutes) also works, but it counts from when the rule is created, not from midnight.
Needs 2 schedules
CronScheduleBuilder.cronSchedule("0 0 0/3 * * ?")
CronScheduleBuilder.cronSchedule("0 30 1/3 * * ?")
  • The leading 0 is the seconds field, so it fires at the top of the minute. Day of week is ? because day of month already holds *, and a * in both is rejected. The optional year is left off.
  • Attach one CronTrigger per expression to the same job. SimpleScheduleBuilder.repeatMinutelyForever(90) is the one-trigger alternative, counted from the trigger’s start time.
Needs 2 schedules
schedule: "0 */3 * * *"
schedule: "30 1-23/3 * * *"
  • A CronJob takes one schedule, so this needs 2 CronJobs sharing a job template.
  • The controller stops starting a CronJob that has missed more than 100 schedules. At this rate that is 150 hours of downtime. startingDeadlineSeconds limits how far back it counts.
Needs 2 schedules
- cron: '0 */3 * * *'
- cron: '30 1-23/3 * * *'
  • GitHub warns that schedules can be delayed at high load, which includes the start of every hour, and that some queued jobs may be dropped. A different minute reduces the risk.
  • List all 2 under schedule: in one workflow. github.event.schedule tells a step which one fired.
Needs 2 schedules
[TimerTrigger("0 0 */3 * * *")]
[TimerTrigger("0 30 1/3 * * *")]
  • Six fields with seconds first, so the leading 0 fires at the top of the minute.
  • A timer trigger takes one expression, so this needs 2 functions. On an App Service plan, the TimeSpan 01:30:00 is the single-trigger alternative, measured between runs rather than from midnight.
Needs 2 schedules

About this schedule

No cron field can step by 90 minutes, because minutes stop at 59. Two lines do it: on the hour every third hour from midnight, and at half past every third hour from 01:30. Ninety minutes divides a day exactly, so there is no short gap at midnight.

Clock changes

Worked out by running each dialect’s engine through New York’s clock changes; it is affected in London, Helsinki too, at their own local hours.

DialectClocks go forward (02:00 becomes 03:00)Clocks go back (02:00 becomes 01:00)
CronNot affected01:30 happens twice, and it runs both times
EventBridge SchedulerNot affected01:30 happens twice, and it runs once, in the first pass
QuartzNot affected01:30 happens twice, and it runs once, in the second pass
KubernetesNot affected01:30 happens twice, and it runs both times
GitHubNot affected01:30 happens twice. GitHub doesn’t document whether it repeats; shown once here
AzureNot affected01:30 happens twice, and it runs both times

Cron follows the crontab man page; daemons differ, and cronie catches up skipped fixed-time jobs. EventBridge applies to Scheduler with a time zone; scheduled rules run in UTC and never see a clock change. Quartz is exact for 2.5.2. GitHub documents the forward case only.

Questions

What is the cron expression for every 90 minutes?
It takes 2 lines, used together: 0 */3 * * *, 30 1-23/3 * * * in standard cron, Kubernetes and GitHub Actions. The other dialects differ: 0 0/3 * * ? *, 30 1/3 * * ? * in EventBridge; 0 0 0/3 * * ?, 0 30 1/3 * * ? in Quartz; 0 0 */3 * * *, 0 30 1/3 * * * in Azure.
Can one cron expression run every 90 minutes?
No. The minute field stops at 59 and the hour field only takes whole hours, so a 90-minute step cannot be written in one line. Two lines, three hours apart and offset by 90 minutes, cover it exactly.
What happens to this schedule when the clocks change?
It depends on the scheduler. When clocks go forward in New York (02:00 becomes 03:00): Cron, EventBridge, Quartz, Kubernetes, GitHub and Azure: not affected. The table on this page also covers the autumn change.

More schedules