UTC сервера vs локальное время, указание TZ
Само cron-выражение не содержит информации о часовом поясе. Время, на которое указывает выражение, следует часовому поясу системы, где работает cron. Поэтому даже одно и то же 0 9 * * * будет выполняться в разное фактическое время в зависимости от часового пояса сервера.
У многих серверов и контейнеров часовой пояс по умолчанию — UTC. Корея (KST) — это UTC+9, поэтому если на UTC-сервере запланировать 0 0 * * * (полночь), задача фактически выполнится в 9 утра по корейскому времени. Ситуация, когда планируют, думая о локальном времени, и получают расхождение в 9 часов, встречается очень часто.
Некоторые реализации cron позволяют добавить в начало crontab строку вроде CRON_TZ=Asia/Seoul, чтобы выражение трактовалось в конкретном часовом поясе. В контейнерном окружении также используют настройку переменной среды TZ образа или /etc/localtime под нужный регион. Однако поддержка зависит от реализации, поэтому это нужно проверять.
В регионах с летним временем (DST) в день перевода часов вперёд или назад определённое время может пропускаться или появляться дважды, из-за чего задача, запланированная на это время, может быть пропущена или продублирована. Важные задачи лучше планировать по UTC, чтобы избежать таких проблем.
Практический совет: мыслите выражение в UTC и обязательно проверяйте реальный часовой пояс среды развёртывания. Кстати, следующие запуски, которые показывает инструмент на этом сайте, приведены в локальном часовом поясе вашего браузера, так что их удобно сопоставлять с часовым поясом сервера.