epochkit

Cron expression for every day at noon

The cron expression 0 12 * * * runs at 12:00 PM. The restricted fields are minute 0 and hour 12; the remaining asterisks match anything. That works out to one run per day.

0 12 * * *

Field breakdown

Field-by-field meaning of the cron expression 0 12 * * *
Field Value Meaning
Minute 0 The top of the hour (:00)
Hour 12 12:00 (noon)
Day of month * Every day of the month (1–31)
Month * Every month (1–12)
Day of week * Every day of the week (0–6)

Next runs

Next 5 runs Timezone: UTC

Run times are calculated in your browser timezone. The scheduler that executes the job uses its own — always UTC on Vercel Cron, UTC by default on GitHub Actions, the host clock on crontab.

How this schedule works

Cron evaluates the five fields of 0 12 * * * — minute, hour, day of month, month, day of week — against the clock once a minute and starts the job on any minute where all five match, which cronstrue reads as "At 12:00 PM": one run per day.

When to use every day at noon

Noon is a useful slot for a midday summary, a lunchtime digest, or a half-day checkpoint in a pipeline that also runs overnight: it puts a run in the middle of the working day without competing with the morning peak or the nightly batch window. It is also the natural second run for a job that already fires at midnight, giving a twelve-hour rhythm with two times that need no explanation in a runbook. Confirm which timezone the scheduler uses before assuming noon lands in the middle of anyone's day.

Common mistakes with every day at noon

The classic error is the one the hour field invites: writing 0 0 * * * when noon was meant. Cron has no AM or PM, hour 12 is noon and hour 0 is midnight, and the slip produces a job that runs exactly twelve hours from where it should — far enough away to look like a timezone bug and burn a day of debugging. Read the raw expression rather than a dashboard's rendering of it. Beyond that, a midday run competes with peak traffic in a way a nightly one does not, so a batch benchmarked at 03:00 can behave very differently at 12:00.

Platform snippets

The same expression, ready to paste into the four schedulers that read five-field cron. The notes below each snippet are the ones that follow from this schedule; the cron expression generator lists every caveat for every platform.

GitHub Actions

yaml
name: Scheduled workflow
on:
  schedule:
    - cron: '0 12 * * *'
  workflow_dispatch:

jobs:
  scheduled:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run job
        run: echo "Running scheduled job"
  • • Workflows scheduled at the top of the hour may be delayed during high-load periods. Consider offsetting the minute field (e.g. "5 12 * * *") for more reliable timing.

Kubernetes CronJob

yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: my-cron-job
spec:
  schedule: "0 12 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: job
              image: my-image:latest
              command: ["/bin/sh", "-c", "echo Running"]
          restartPolicy: OnFailure
  • • Do NOT use CRON_TZ or TZ inside the schedule string. Kubernetes 1.29+ rejects this at creation with a validation error; earlier versions issue a warning. Existing CronJobs using TZ/CRON_TZ will continue to warn on update. Use the timeZone field instead.

Vercel Cron

json
{
  "$schema": "https://openapi.vercel.sh/vercel.json",
  "crons": [
    {
      "path": "/api/cron",
      "schedule": "0 12 * * *"
    }
  ]
}
  • • Hobby plan: invocations occur within the specified hour (e.g. "0 8 * * *" runs between 08:00:00 and 08:59:59).

crontab

bash
# Edit your crontab: crontab -e
0 12 * * * /path/to/command

# With logging:
0 12 * * * /path/to/command >> /var/log/cron.log 2>&1

Variations

Frequently asked questions

How do I read the cron expression 0 12 * * *?

Read the five space-separated fields left to right as minute, hour, day of month, month, and day of week. In 0 12 * * * the minute is 0, hour is 12, day of month is *, month is *, day of week is *. Of the operators cron defines, this expression uses only the ones that matter here: an asterisk matches every value in its field. Put together, cronstrue reads the whole thing as "At 12:00 PM", and a scheduler that checks all five fields once a minute will start the job one run per day.

What timezone does 0 12 * * * run in?

The expression carries no timezone of its own: it names hour 12, and the scheduler decides which hour 12 that is. Read as UTC, the run lands at 12:00 — 07:00 in New York, 12:00 in London, and 21:00 in Tokyo on a January date, with daylight saving moving the first two later in the year, so the same UTC instant is 08:00 in New York in July. Set the zone rather than converting by hand where you can: GitHub Actions defaults to UTC but takes an optional timezone key beside cron, and a Kubernetes CronJob has spec.timeZone, stable since 1.27. Where you cannot, convert deliberately: Vercel Cron is UTC-only, and a Linux crontab follows the host clock unless CRON_TZ overrides it.

Is noon written as 12 or 0 in a cron expression?

The hour field uses a 24-hour clock from 0 to 23, so noon is hour 12 and midnight is hour 0. There is no 24, and no AM or PM notation. The common mistake is writing 0 0 * * * when noon was intended — that expression runs at midnight, twelve hours away from the target, and the error usually surfaces only after a day of missing reports. Twelve-hour thinking also explains why 0 12 * * * is sometimes mislabeled midnight in dashboards; read the raw expression rather than a rendered label when the timing matters.

Related cron schedules

Build a custom schedule in the cron expression generator, or browse every epochkit tool.