Cron expression for Every Thursday
0 0 * * 4
Runs once a week, at midnight every Thursday.
Next 5 runs (your local time)
These are shown in your browser’s timezone. The job itself runs in the scheduler’s timezone — often UTC — so the real run time can differ.
What people actually schedule with 0 0 * * 4
- Scheduling a weekly staging-to-production release window on the last day senior staff are reliably around before the weekend
- Generating a pre-Friday financial or payroll pre-check so any data issues surface with a full business day left to fix them
- Running a weekly cleanup of expired sessions or temp data ahead of the higher-traffic Friday and weekend load
Use 0 0 * * 4 on your platform
It’s the same 5-field expression everywhere — what changes is where you put it and which timezone it runs in.
Linux / crontab
0 0 * * 4 /path/to/your-command
Runs in the server’s local timezone — check it with timedatectl.
Full field reference: crontab(5) man page.
GitHub Actions
on:
schedule:
- cron: "0 0 * * 4"
GitHub Actions always runs scheduled jobs in UTC — there is no timezone setting, and runs can be delayed under load (official docs).
Kubernetes CronJob
spec:
schedule: "0 0 * * 4"
Defaults to UTC. Set spec.timeZone (Kubernetes 1.27+)
for a specific zone — see the
CronJob docs.
Quartz / Spring @Scheduled
Quartz uses 6 fields (seconds first): 0 0 0 * * 4. Watch out:
Quartz day-of-week is 1=SUN … 7=SAT (not 0–6), and day-of-month /
day-of-week use ? — double-check if your schedule touches those fields
(Quartz cron reference).
Gotchas with every thursday schedules
- Thursday is
4— and "the last working day before Friday" assumption breaks around holidays. If Friday is a holiday and Thursday becomes the de-facto Friday,0 0 * * 4still fires at its usual midnight, not adjusted. Cron knows weekdays, not your office calendar; don't let "Thursday" stand in for "last business day" without a guard. - Midnight Thursday runs against Wednesday's data, which surprises pre-Friday reports.
0 0 * * 4executes at 00:00 Thursday — before Thursday's business activity exists. A "Thursday snapshot" built this way is really a Wednesday-night snapshot; move to0 18 * * 4if you need Thursday's actual numbers. - A Thursday release job that overruns into Friday gets no second chance for a week. Unlike a daily job, if the weekly Thursday task hangs past midnight and is killed, the next attempt is seven days out. Add a timeout wrapper (
timeout 30m yourcmd) so it fails fast and alerts the same night rather than silently rolling to next Thursday.
Will you know if this job silently fails?
Cron jobs fail quietly — a server reboots, a path changes, or an error code is ignored — and nobody notices until the data is missing. A cron monitor (a dead-man’s-switch) alerts you when a scheduled job does not check in on time.
Monitor your cron jobs with UptimeRobot →
Disclosure: this is an affiliate link — we may earn a commission if you sign up, at no extra cost to you.
Is 0 0 * * 4 the right schedule?
If you really want "the last working day of the week," every weekday at 5pm naturally covers Friday end-of-day five times over, instead of hard-coding Thursday. Keep 0 0 * * 4 only when something specifically needs Thursday.
Or use the interactive cron generator & explainer, read the complete cron syntax guide, or pick another common schedule: