DEVESSENTIALS

0 15 * * * — What does this cron expression mean?

0 15 * * * is a daytime schedule. Cron has no AM/PM, so “3 PM” is written as hour 15, and 0 3 * * * would be 3 AM. Unlike the nightly 2 AM or 4 AM jobs, a 15:00 job runs while people are working, which is usually the point: a report people read before they leave, or a reminder that has to arrive in office hours.

In plain English

0 15 * * *

Run the job once a day at exactly 15:00 (3:00 PM) in the scheduler's timezone.

Frequency: 1 run per day. cronstrue reads it as “At 15:00”.

Open 0 15 * * * in the Cron Builder

Field-by-field breakdown

0

Minute

0–59

15

Hour

0–23

*

Day of month

1–31

*

Month

1–12

*

Day of week

0–6

  • Minute0 — at minute 0.
  • Hour15 — at hour 15, which is 3 PM on the 24-hour clock.
  • Day of month* — every day of the month.
  • Month* — every month.
  • Day of week* — every day of the week, including weekends. Use 1-5 here for weekdays only.

Next run times

Example: next 5 runs

Example: if it is Monday, 5 Jan 2026, 09:07 UTC, the next runs of 0 15 * * * (UTC) are:

  1. #1Mon, 5 Jan 2026, 15:00 UTC
  2. #2Tue, 6 Jan 2026, 15:00 UTC
  3. #3Wed, 7 Jan 2026, 15:00 UTC
  4. #4Thu, 8 Jan 2026, 15:00 UTC
  5. #5Fri, 9 Jan 2026, 15:00 UTC

Live times from your current clock replace this example once the page loads. Cron uses the scheduler's timezone; most cloud servers, GitHub Actions and AWS EventBridge rules use UTC.

0 15 * * * in Quartz, AWS, GitHub Actions, Kubernetes and systemd

Crontab (Linux / macOS)

0 15 * * * /usr/local/bin/job.sh >> /var/log/job.log 2>&1

Standard 5-field syntax used by Vixie cron, cronie, busybox crond and most libraries (node-cron, APScheduler, robfig/cron).

Quartz (6 and 7 fields)

0 0 15 * * ?
0 0 15 * * ? *

# Spring @Scheduled
@Scheduled(cron = "0 0 15 * * *")

Weekdays only in Quartz: 0 0 15 ? * MON-FRI. Quartz needs ? in day-of-month when day-of-week is set.

AWS EventBridge

cron(0 15 * * ? *)

15:00 UTC. Weekdays only: cron(0 15 ? * MON-FRI *). Note the ? moves to day-of-month when day-of-week is restricted.

GitHub Actions

on:
  schedule:
    # Every day at 3:00 PM, evaluated in UTC
    - cron: '0 15 * * *'

15:00 UTC is 11:00 in New York (EDT), 08:00 in San Francisco (PDT) and 16:00 or 17:00 in Berlin depending on DST, so one schedule falls inside working hours on both sides of the Atlantic.

Kubernetes CronJob

apiVersion: batch/v1
kind: CronJob
metadata:
  name: every-day-at-3pm
spec:
  schedule: "0 15 * * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 900
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: alpine:3.20
              command: ["/bin/sh", "-c", "echo running"]

Daytime jobs usually compete with production traffic. Set resource requests and limits so the Job cannot starve user-facing Pods.

systemd timer

# /etc/systemd/system/myjob.timer
[Unit]
Description=Every day at 3:00 PM

[Timer]
OnCalendar=*-*-* 15:00:00
Persistent=true

[Install]
WantedBy=timers.target

Weekdays only: OnCalendar=Mon..Fri *-*-* 15:00:00.

When to use every day at 3:00 pm

  • Daily status or sales summary sent before the end of the working day.
  • Reminders for open tickets, pending approvals or unsubmitted timesheets.
  • Midnight jobs for Japan or Korea when the server runs on UTC (15:00 UTC is 00:00 JST/KST).
  • Afternoon cache warm-up before a predictable evening traffic peak.

Common pitfalls with 0 15 * * *

3 PM is hour 15, not 3

Cron uses a 24-hour clock. 0 3 * * * runs at 3 AM, twelve hours away from what you meant. Double-check by reading the next run times above before deploying.

0 3 * * *    # 03:00, 3 AM
0 15 * * *   # 15:00, 3 PM

15:00 in which timezone?

On a UTC server, 0 15 * * * is midnight in Tokyo and Seoul, 11 AM in New York in summer (10 AM in winter) and 8 PM in Mumbai. If the job targets a specific office, set the scheduler's timezone (CRON_TZ, Kubernetes timeZone, Spring zone) instead of converting by hand.

Running during peak traffic

Unlike nightly jobs, a 15:00 job shares the database with real users. Batch heavy queries, use a read replica or lower the job's priority with nice/ionice so a report doesn't slow down checkout.

0 15 * * * nice -n 10 ionice -c3 /usr/local/bin/daily-report.sh

Related cron expressions

Need a different schedule? Paste 0 15 * * * into the Cron Builder and edit it, browse all cron expressions, read the cron syntax guide or copy from the cron examples list.

Frequently Asked Questions

What does 0 15 * * * mean in cron?▾

Once a day at 15:00, which is 3:00 PM. The 0 is the minute and the 15 is the hour on a 24-hour clock; the other fields are * so it runs every day.

How do I run a cron job at 3 PM on weekdays only?▾

Use 0 15 * * 1-5 in crontab (or 0 15 * * MON-FRI). In AWS EventBridge it is cron(0 15 ? * MON-FRI *), and in Quartz 0 0 15 ? * MON-FRI.

What is 0 15 * * * in AWS EventBridge?▾

cron(0 15 * * ? *). EventBridge rules use UTC, so this is 15:00 UTC every day. If you need 3 PM in a local timezone, use EventBridge Scheduler and set its timezone.