---
{
  "id": "platform.cron.schedules-and-timezones",
  "topic": "cron",
  "title": "Cron schedules, RRULE, and timezones",
  "locale": "en",
  "version": "2026-07-17",
  "summary": "Cron uses runAt for one-time jobs and RRULE plus a bounded window for recurring jobs, interpreted in an IANA timezone.",
  "content": "For `schedule.kind: once`, provide `runAt`; it must be at least 60 seconds in the future and no more than 365 days ahead. For `schedule.kind: recurring`, provide an RRULE string and at least one boundary: `endAt` or `maxRuns`. The first two occurrences must be at least 900 seconds (15 minutes) apart. The platform contract is RRULE, not a guessed five-field cron expression.\n\nEvery schedule requires a valid IANA timezone such as `Asia/Taipei`. `startAt` anchors a recurring series, `endAt` bounds it by time, and `maxRuns` bounds its count. The runtime RRULE engine owns DST and local wall-clock behavior; use actual results and tests rather than manually adjusting offsets.\n\nAfter downtime, recurring calculation selects the next future occurrence. It does not replay every missed occurrence. Invalid timezone, RRULE, missing recurring boundary, exhausted range, or an interval below 15 minutes must be treated as runtime validation outcomes, not as a successful schedule.\n",
  "aliases": [
    "RRULE schedule",
    "IANA timezone",
    "recurring interval",
    "runAt",
    "daylight saving time",
    "missed occurrence"
  ],
  "tags": [
    "cron",
    "rrule",
    "timezone"
  ],
  "relatedActions": [
    "arinova.cron.schedule",
    "arinova.cron.update_job"
  ],
  "relatedActionPrefixes": [],
  "sourceReviewedAt": "2026-09-06",
  "url": "https://docs.arinova.ai/en/kb/cron/schedules-and-timezones/"
}
---

For `schedule.kind: once`, provide `runAt`; it must be at least 60 seconds in the future and no more than 365 days ahead. For `schedule.kind: recurring`, provide an RRULE string and at least one boundary: `endAt` or `maxRuns`. The first two occurrences must be at least 900 seconds (15 minutes) apart. The platform contract is RRULE, not a guessed five-field cron expression.

Every schedule requires a valid IANA timezone such as `Asia/Taipei`. `startAt` anchors a recurring series, `endAt` bounds it by time, and `maxRuns` bounds its count. The runtime RRULE engine owns DST and local wall-clock behavior; use actual results and tests rather than manually adjusting offsets.

After downtime, recurring calculation selects the next future occurrence. It does not replay every missed occurrence. Invalid timezone, RRULE, missing recurring boundary, exhausted range, or an interval below 15 minutes must be treated as runtime validation outcomes, not as a successful schedule.
