Curated cron expression
Twice Daily at 9 AM and 6 PM Cron Expression: 0 9,18 * * *
Learn how 0 9,18 * * * schedules two daily runs, with exact field meaning, next-run ordering, timezone and DST behavior, use cases, and platform-specific equivalents.
Meaning at a glance
0 9,18 * * *
Run every day at 09:00 and 18:00
Two times per calendar day with unequal elapsed gaps of 9 hours and 15 hours.
Next-run example: At 10:00, the next runs are 18:00 today, 09:00 tomorrow, and 18:00 tomorrow.
How 0 9,18 * * * works
The comma-separated hour list 9,18 selects two hour values while minute 0 selects the top of each hour. It runs at 09:00 and 18:00 every calendar day.
This is a calendar schedule, not “every nine hours.” The gap from 09:00 to 18:00 is nine hours, but the overnight gap is fifteen hours.
| Field | Value | Meaning |
|---|---|---|
| Minute | 0 | At minute zero |
| Hour | 9,18 | At hours 09 and 18 |
| Day of month | * | Every date |
| Month | * | Every month |
| Day of week | * | Every weekday |
Good use cases
- Morning and evening digest
- Twice-daily reconciliation
- Business opening and closing sync
- Inventory refresh
Timezone and daylight-saving behavior
Pin the audience timezone when the two hours represent business moments rather than fixed UTC instants.
Named timezone scheduling keeps 09:00 and 18:00 on the wall clock while their UTC offsets can change.
The expression does not contain a timezone. The scheduler supplies that context. Use the next-run preview above in the same IANA timezone as production, then confirm the target platform's own timezone rules.
Platform compatibility and converted expressions
The source expression is five-field Unix cron. Use the exact equivalent below rather than adding or removing fields by sight.
| Platform | Status | Expression | What to know |
|---|---|---|---|
| Unix crontab | Ready | 0 9,18 * * * | Use directly in a normal five-field user crontab. |
| Kubernetes CronJob | Ready | 0 9,18 * * * | Use as spec.schedule; set spec.timeZone when local wall-clock behavior matters. |
| GitHub Actions | Ready | 0 9,18 * * * | Use under on.schedule; UTC is the default and an IANA timezone may be specified. |
| Vercel Cron Jobs | Plan / behavior limit | 0 9,18 * * * | Expression is valid on eligible plans, but both hours are UTC; Hobby is daily-only. |
| AWS EventBridge Scheduler | Convert | cron(0 9,18 * * ? *) | Convert to AWS minute-first cron(...), add the required year, and use ? in one day field. |
| Spring @Scheduled | Convert | 0 0 9,18 * * * | Use Spring’s six fields by prepending seconds and set zone explicitly when needed. |
| systemd timer | Convert | *-*-* 09,18:00:00 | Use OnCalendar syntax and validate it with systemd-analyze calendar on the target host. |
Edge cases to check before deployment
- The two intervals are not equal, so do not use this for an every-N-hours requirement.
- Both runs should derive their processing window explicitly instead of guessing from the current hour.
- Vercel always interprets the two hours in UTC.
Frequently asked questions
What does the cron expression 0 9,18 * * * mean?
0 9,18 * * * means “run every day at 09:00 and 18:00.” Two times per calendar day with unequal elapsed gaps of 9 hours and 15 hours.
What are the next run times for 0 9,18 * * *?
At 10:00, the next runs are 18:00 today, 09:00 tomorrow, and 18:00 tomorrow. Exact timestamps depend on the scheduler timezone and the current time.
What timezone does 0 9,18 * * * use?
Pin the audience timezone when the two hours represent business moments rather than fixed UTC instants.
Can I use 0 9,18 * * * on every scheduling platform?
No. It is a five-field Unix expression. Some platforms accept it directly, while AWS EventBridge Scheduler, Spring, and systemd require the converted form shown in the compatibility table.