Cronwise

Часовые пояса в cron для глобальных команд

Предсказывайте, когда ваши cron-задачи действительно запустятся в каждом часовом поясе и при каждом переходе на летнее время.

Открыть генератор cron

Почему часовые пояса cron сбивают с толку глобальные команды

Большинство ошибок cron возникают ещё до развёртывания, когда замысел расписания расходится с синтаксисом. Cron-выражение вроде 0 9 * * * выглядит достаточно просто: запускать каждый день в 9:00. Но 9:00 где? Ответ полностью зависит от того, какой часовой пояс использует cron-демон, и это редко совпадает с тем, что вы имеете в виду при написании выражения.

Для команд, работающих в нескольких регионах, непонимание часовых поясов — главный источник сбоев планирования. Задача резервного копирования, нацеленная на конец рабочего дня в Нью-Йорке, срабатывает в 2:00 ночи в Токио. Отчёт для лондонского утра попадает в почтовые ящики в полночь в Сан-Франциско. Эти проблемы множатся, когда переход на летнее время сдвигает смещение на час дважды в год.

Эта статья объясняет, как cron интерпретирует время, как конфигурация часового пояса меняет выполнение и как валидировать расписания до их попадания в продакшен. Понимание поведения часовых поясов — основа надёжного планирования для распределённых команд.

Как cron интерпретирует время: UTC и местное время

Каждое cron-выражение определяет расписание в терминах минут, часов, дней, месяцев и дней недели. Эти пять полей описывают когда запускаться, но ничего не говорят о том, где в мире это время применяется. Контекст часового пояса приходит извне выражения.

Часовой пояс на уровне системы

В большинстве систем Unix и Linux cron-демон работает в часовом поясе, установленном системными часами или переменной окружения TZ. Если ваш сервер настроен на America/New_York, то 0 9 * * * означает 9:00 по восточному времени. Перенесите тот же crontab на сервер с UTC, и задача сработает в 9:00 UTC вместо этого — что соответствует 4:00 или 5:00 по восточному времени в зависимости от сезона.

UTC как базовая точка

Многие операционные команды стандартизируют на UTC для устранения двусмысленности. Когда каждый сервер использует UTC, нет сдвига смещения при переходах на летнее время, и каждый член команды может вычислить местные эквиваленты из единой точки отсчёта. Однако планирование в UTC требует мысленной конвертации бизнес-требований («запуск в 9:00 по тихоокеанскому времени») в UTC-смещения («запуск в 17:00 UTC» или «16:00 UTC» в зависимости от времени года).

Подробнее о том, как переходы на летнее время создают риски планирования, читайте Риски летнего времени в cron-задачах.

Паттерны часовых поясов, которые должна знать каждая команда

Таблица ниже показывает, как одно cron-выражение сопоставляется с разным временем выполнения в зависимости от настроенного часового пояса. Понимание этих паттернов предотвращает самые распространённые ошибки глобального планирования.

ВыражениеЧасовой пояс сервераСрабатывает (местное)Срабатывает (UTC)
0 9 * * 1-5America/New_York (EST)09:00 ET14:00 UTC
0 9 * * 1-5America/New_York (EDT)09:00 ET13:00 UTC
0 9 * * 1-5Europe/London (GMT)09:00 GMT09:00 UTC
0 9 * * 1-5Europe/London (BST)09:00 BST08:00 UTC
0 9 * * 1-5Asia/Tokyo (JST)09:00 JST00:00 UTC

Обратите внимание: одно и то же выражение даёт пять разных времён выполнения в UTC. Для Нью-Йорка и Лондона UTC-эквивалент сдвигается на час между стандартным и летним временем. Токио, не использующее летнее время, остаётся постоянным круглый год.

Когда несколько команд зависят от одной задачи, документируйте и местную интерпретацию, и UTC-эквивалент. Это предотвращает путаницу, когда кто-то из другого региона читает расписание.

Крайние случаи, которые застают команды врасплох

Пропущенный час

При переводе часов вперёд на летнее время один час полностью пропускается. Если ваша cron-задача запланирована на этот пропущенный час — например, 30 2 * * * (2:30) в ночь, когда часы перескакивают с 1:59 сразу на 3:00 — поведение зависит от реализации cron. Некоторые демоны полностью пропускают выполнение. Другие запускают его в 3:00. Некоторые запускают дважды. Единого стандарта нет.

Повторяющийся час

Осенью часы переводятся назад, и один час повторяется. Задача, запланированная на 30 1 * * * (1:30), может выполниться дважды — один раз до перевода и один раз после. Для идемпотентных задач это может быть безвредно, но для финансовых транзакций или генерации отчётов дублирование может вызвать реальные проблемы.

Расписания, пересекающие полночь

Расписания, охватывающие полночь в одном часовом поясе, могут попасть на другой календарный день в другом. Задача на 0 23 * * 5 (23:00 пятницы) в America/Los_Angeles фактически срабатывает в 7:00 субботы в Europe/London зимой. Если задача имеет ограничения по дням недели, поле дня недели может не соответствовать ожиданиям из перспективы другого часового пояса.

Эти крайние случаи — где инструменты валидации становятся незаменимыми. Просмотр десяти ближайших запусков в целевом часовом поясе выявляет проблемы, невидимые в самом выражении.

Стандартный cron и Quartz: различия часовых поясов

Стандартные 5-полевые cron-выражения полностью зависят от системного часового пояса. Невозможно встроить информацию о часовом поясе в само выражение. Расписание 0 8 * * * всегда означает «8:00 в том часовом поясе, который использует демон».

Quartz Scheduler, широко используемый в Java-системах, расширяет cron дополнительными полями (секунды и необязательный год) и добавляет отдельный параметр часового пояса на уровне планировщика или триггера. Это означает, что Quartz-триггер может указать America/Chicago как свой часовой пояс независимо от системных часов сервера. Поля выражения затем интерпретируются в этом часовом поясе.

Это различие важно для глобальных команд, потому что Quartz позволяет определять регион-специфичные расписания на одном сервере. Вы можете запускать один триггер в 9:00 по восточному и другой в 9:00 по тихоокеанскому времени без изменения часового пояса сервера. Стандартный cron требует либо отдельных серверов на каждый часовой пояс, либо ручной конвертации в UTC.

Подробное сравнение синтаксиса и различий полей читайте в статье Quartz и стандартный cron. Если вы работаете с Quartz-выражениями, расшифровщик Quartz на Cronwise разбирает и валидирует 7-полевые выражения с предварительным просмотром запусков с учётом часового пояса.

Контрольный список проверки перед продакшеном

Перед развёртыванием любого cron-расписания, связанного с несколькими часовыми поясами или регионами с летним временем, пройдите этот контрольный список для раннего выявления проблем.

ПроверкаПочему это важноКритерий прохождения
Подтвердите часовой пояс демонаПоля выражения интерпретируются в этом часовом поясеЧасовой пояс совпадает с задокументированным ожиданием
Проверьте 10 ближайших запусковВыявляет пропуски, дубли и дрейф смещения из-за летнего времениВсе запуски приходятся на ожидаемые даты и время
Проверьте кросс-региональное соответствиеНижестоящие системы могут зависеть от времениUTC-эквиваленты совпадают с окнами зависимостей
Проверьте границы летнего времениДаты перевода часов весной и осенью меняют поведениеНет пропущенных или дублированных запусков для критических задач
Задокументируйте местное и UTC-времяЧленам команды в других регионах нужен однозначный справочникРанбук содержит оба представления

Этот контрольный список одинаково применим к стандартному cron и Quartz-триггерам. Различие — в том, где настраивается часовой пояс, а не в том, важен ли он.

Применение учёта часовых поясов в Cronwise

Cronwise создан, чтобы помочь вам выявлять проблемы планирования, связанные с часовыми поясами, до их попадания в продакшен. Вот как эффективно использовать рабочий процесс.

Начните с ввода или создания выражения в генераторе cron. Генератор валидирует синтаксис в реальном времени, показывая ошибки и предупреждения на уровне полей по мере ввода. Когда выражение корректно, выберите целевой часовой пояс IANA из выпадающего списка. Таблица предварительного просмотра немедленно обновится, показывая 10 ближайших запусков в этом часовом поясе.

Просмотрите таблицу на предмет запусков, попадающих в окно перехода на летнее время. Если вы видите пропуск или подозрительное время, скорректируйте поле часа или перейдите на расписание в UTC. Для Quartz-выражений используйте расшифровщик Quartz для проверки правильного разбора полей секунд, года и дня недели наряду с выбором часового пояса.

Когда вы уверены в расписании, сохраните выражение с описательной заметкой с помощью встроенной функции сохранения. Cronwise хранит до 10 выражений локально, и вы можете экспортировать их как файлы JSON или TXT для обмена с командой. Этот рабочий процесс — создать, валидировать, просмотреть, сохранить — снижает риск попадания ошибок часовых поясов в продакшен.

Итог и дальнейшие шаги

Cron-выражения определяют когда запускаться, но конфигурация часового пояса определяет где это время применяется. Для глобальных команд это различие — корневая причина большинства сбоев планирования. Стандартный cron наследует системный часовой пояс. Quartz cron позволяет назначать часовой пояс для каждого триггера. Оба требуют проверки времени выполнения через переходы на летнее время.

Всегда подтверждайте часовой пояс демона, просматривайте 10 ближайших запусков в целевом часовом поясе, документируйте расписания в местном и UTC-формате и проверяйте вблизи дат перехода на летнее время. Эти шаги выявляют ошибки, которые одна только синтаксическая валидация не обнаружит.

Для смежных тем смотрите все статьи по cron на Cronwise для углубления знаний о планировании.