Запланированные рабочие места в часы осенней смены времени

12

Мне интересно, как другие люди справляются с этим сценарием.

Что делать, если у вас есть работа, запланированная на 1:30? Осенью, когда время меняется, время с 1:00:00 до 1:59:59 повторяется, и задание запускается дважды.

Это может быть планировщик задач Windows, агент SQL или любой другой инструмент планирования. Большинство этих инструментов, похоже, основаны на машинном времени, а не на времени UTC. Если бы я сказал, чтобы каждый вечер выполнял работу в UTC, у меня не было бы проблемы с дублированием часов.

NealWalters
источник
1
Я не могу найти ничего более актуального, но надеюсь, что это проливает некоторый свет на эту проблему для вас - support.microsoft.com/kb/325413
joeqwerty
Это отлично, почему бы не опубликовать в ответе?
NealWalters
Ну, на самом деле это не дает вам решения (по крайней мере, не то, чтобы я мог различить его чтение), но я подумал, что это поможет понять проблему. Я счастлив оставить это как комментарий.
Joeqwerty

Ответы:

10

Надлежащее планирование будущих задач по местному времени с учетом часовых поясов и перехода на летнее время является очень сложной задачей. Я писал об этом раньше с точки зрения программирования на переполнение стека здесь и здесь .

Я подведу итог с точки зрения не программирования:

  • Определите ваши шаблоны повторения по местному времени, а не по UTC . Например, если вы установили ежедневный будильник, чтобы будить вас каждый день в 8:00, вы не хотите вставать на час раньше или на час позже после перехода на летнее время. Если я нахожусь в часовом поясе Тихоокеанского региона США, я не могу запланировать на 16:00 UTC, потому что после перехода он должен будет переключиться на 15:00 UTC, чтобы сохранить то же самое местное время в 8:00.

  • Определите часовой пояс, который представляет «местное» время. Не думайте, что локальный часовой пояс сервера - это тот же часовой пояс, который важен для конечного пользователя.

  • Спроектируйте местное время на дату и время UTC для каждого события, для которого вы хотите, чтобы событие сработало.

    • Вы почти всегда будете делать это для следующего немедленного вхождения, так что вы можете использовать часы UTC, чтобы определить реальный момент времени для запуска.

    • В некоторых случаях вы можете также спроецировать следующие несколько (или много) экземпляров, например, следующие 5 вхождений или все вхождения на следующий год. (Эта часть очень специфична для требований приложения.)

  • Имейте в наличии стратегию (фиксированную или настраиваемую), что делать для случаев, которые выпадают во время перехода на летнее время :

    • Для перехода «весна вперед» существует пропущенное местное время, когда вхождение может не существовать. Например, в тихоокеанском времени США ежедневное задание, запланированное на 2:00 утра по местному времени, не будет работать 9 марта 2014 года. В большинстве случаев вы хотите увеличить это время на сумму экономии (обычно 1 час). ), поэтому в этот день он будет работать в 3:00, но в следующий раз он снова будет работать в 2:00. (Однако вполне возможно, что вам понадобится другая стратегия для этого.)

    • Для перехода «откат» существует дублирование местного времени, когда вхождение может существовать дважды . Например, в тихоокеанском времени США ежедневное задание, запланированное на 1:00, будет иметь два возможных времени, на которые оно может быть выполнено 2 ноября 2014 года. В большинстве случаев вы захотите запустить его при первом появлении 1 : 00:00 по тихоокеанскому времени и пропустить следующее в 1:00 по тихоокеанскому времени той же даты. (Но, опять же, вы можете захотеть использовать другую стратегию, например, работать во втором случае или работать в обоих. YMMV)

  • Будьте готовы пересчитать все время вашего UTC, если вам когда-нибудь понадобится обновить данные часового пояса. В IANA / Olson TZDB тушит несколько обновлений каждый год , потому что правительства стран мира передумать все время о времени смещения зоны и перехода на летнее время правила. Вы не можете предполагать в течение какого-то определенного периода времени в будущем, что правила не изменятся .

    • Обязательно подпишитесь на анонсы выпусков данных о часовых поясах, и есть процесс для их применения в ваших системах и / или приложениях.

    • В традиционных корпоративных условиях ответственность за это должны выполнять сотрудники ИТ-отдела.

    • В зависимости от вашей среды вы можете получать эти данные через tzdataобновления пакетов linux, через Java JRE или tzupdater , или через любое количество других каналов. Иногда это зависит от конкретной среды, а иногда - от платформы программирования, такой как пакет PECL timezonedb для PHP и многие другие.

    • У Microsoft есть собственные данные о часовых поясах. В Windows, если вы используете TimeZoneInfoиз .NET (например), вы используете эти данные. Обновления поступают отсюда , а также автоматически выгружаются через Центр обновления Windows, поэтому вам следует следить за ними, чтобы вы знали, когда / если вам нужно пересчитать.

  • Со всем, что понял, там есть еще сценарий , в котором вы бы планировать только по Гринвичу, и что для АБСОЛЮТНЫХ будущих событий. Примеры:

    • Работа, которая выполняется каждые X часов или каждые X минут.

    • Время начала и окончания восхода солнца или другое астрономическое явление.

    • Чувствительное ко времени окно безопасности, например, при передаче конфиденциальной информации другой стороне в заранее установленное время.


Планировщик заданий Windows

Windows не обязательно делает правильные вещи. Обратите внимание на то, как вы определяете триггер:

Планировщик заданий Windows

Если вы установите флажок «Синхронизировать по часовым поясам», тогда задача будет запланирована только по UTC. (Время все еще отображается как местное время, но хранится как UTC.) Так что это для того, что я ранее назвал «абсолютным» событием.

Когда вы оставите этот флажок без отметки, он будет использовать местный часовой пояс компьютера, на котором выполняется код. Он не дает никакой возможности указать часовой пояс, так что это не очень хорошая реализация IMHO.

Я не совсем уверен, что такое поведение DST, но я поэкспериментирую и перезвоню вам. Это, вероятно, делает то, что я описал выше, но не обязательно.


Агент SQL

Планировщик агента SQL еще хуже: он позволяет использовать только время локального сервера. Опять же, нельзя указывать часовые пояса, и вы также не можете указать UTC.

Это было запрошено , но не принято.

Мэтт Джонсон-Пинт
источник
Итак, в итоге, с помощью специальных инструментов SQL Agent и Windows Task Scheduler, у вас есть ручные изменения, которые нужно вносить каждый раз, верно? Или, возможно, код, запущенный из планировщика, может перепроверить время UTC, а затем, возможно, сделать задержку (осенью), но никак не избежать работы, не выполняющейся в Spring, кроме ручного изменения. Или, может быть, скрипт для перепрограммирования графика?
NealWalters
Я обновил ответ информацией о планировщике задач Windows и агенте SQL. Ни один из них не делает все правильно. Если вы хотите разработать собственное решение, вы можете посмотреть на Quartz.net .
Мэтт Джонсон-Пинт
В краткосрочной перспективе вы можете использовать планировщик заданий Windows с установленным флажком, чтобы определить задачи для запуска в определенное время UTC. Но вы, вероятно, захотите, чтобы это были однократные задачи, которые вы создаете программно из своего собственного кода, чтобы вы могли принять во внимание все остальное.
Мэтт Джонсон-Пинт
Еще один отличный ответ!
NealWalters
1

Не заботясь, как правило.

Задайте вопрос "а что, если задание выполняется дважды?"

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

HopelessN00b
источник
Если бы мне было все равно, я бы не спросил. Некоторые имеют значение, некоторые нет. В 2:00 у нас есть задания, которые извлекают файл и отправляют его нашим поставщикам. Я не думаю, что 2:00 повторится. Мы собираемся перейти на 2:05 только для дополнительной страховки. У нас есть резервные копии, умные задания индекса и т. Д., Но, к счастью, они позже.
NealWalters
1
@NealWalters Я думаю, что это справедливо, справедливо по отношению к hopelessnoob: если не имеет значения, если задача выполняется дважды, зачем волноваться. Я не знаю о вас, но у меня есть множество поводов для беспокойства, о которых нужно беспокоиться, не беспокоясь о вещах, о которых мне не нужно беспокоиться. Если это имеет значение, то вы уже должны его кодировать, чтобы все- таки проверить его работоспособность . Сказав это, это, конечно, хорошая идея, чтобы избежать планирования вещей для запуска в тот момент, когда часы возвращаются - это просто напрашивается на неприятности.
Роб Мойр
Это не мой выбор, мы отправляем извлеченные файлы в аэропорты в это время утром, и именно в это время они хотят получить файл. Мы используем BizTalk, систему, основанную на сообщениях, поэтому сложнее перепроверить такие вещи. Немного разочаровывает, что планировщик SQL и планировщик задач Windows не допускают ежедневного времени UTC.
NealWalters
1

Как вы заметили, час между 1:00 и 2:00 повторяется в конце летнего времени; когда происходит обратное изменение (начало летнего времени), промежуток времени между 2 и 3 часами утра не наступит (и ваша работа не будет выполняться). Ваши лучшие варианты будут

  • запустить график работы до UTC
  • запускать задание за пределами смены (0:59 или 3:00)
Андрей
источник