A Quartz cron expression has six fields, with seconds first. The example `0 0 9 * * ?` means second 0, minute 0, hour 9, every day of month, every month, and no separate weekday constraint. In plain English, it runs every day at 9:00 AM in the scheduler timezone. This is the main difference from standard Unix cron, where the equivalent daily 9 AM expression is only five fields: `0 9 * * *`.
The `?` character is a Quartz-specific placeholder for either day-of-month or day-of-week. It means no specific value for that field. Use it when the other day field already expresses the schedule, or when you want to avoid accidentally combining two calendar constraints. For a daily schedule, `*` in day-of-month plus `?` in weekday is a common Quartz pattern.
AWS EventBridge cron expressions are often described as Quartz-like, but they are not a direct paste target for Quartz strings. AWS uses six fields inside `cron(...)` in the order minute, hour, day-of-month, month, day-of-week, and year. There is no seconds field. So the AWS version of this schedule is `cron(0 9 * * ? *)`, while the Quartz or Spring form is `0 0 9 * * ?`.
Before shipping a scheduled job, verify which cron dialect your platform expects. Spring Scheduler and Quartz jobs usually accept a seconds field. Linux crontab, GitHub Actions, and Kubernetes CronJobs use five fields. AWS EventBridge and EventBridge Scheduler use the AWS `cron(...)` wrapper. Counting the fields first prevents the most common production mistake: shifting every value one position to the right.