Заплановані робочі місця в осінній час змінюються часом


12

Мені цікаво, як інші люди справляються з цим сценарієм.

Що робити, якщо у вас запланована робота на 1:30 ранку. Восени, коли час змінюється, година 1:00:00 до 1:59:59 повторюється, і ця робота би виконувалася двічі.

Можливо, це планувальник завдань Windows, агент SQL або будь-який інший інструмент планування. Здається, більшість цих інструментів базується на машинному часу, а не на UTC. Якби я сказав йому виконувати завдання щовечора в UTC, тоді я б не мав дублювати годину.


1
Я не зміг знайти щось більш актуальне, але, сподіваємось, це прояснить проблему для вас - support.microsoft.com/kb/325413
joeqwerty

Це чудово, чому б не поставити відповідь?
NealWalters

Ну, це насправді не дає вам рішення (принаймні, не те, що я міг би відрізнитися від його читання), але я подумав, що це буде корисним для розуміння проблеми. Я радий залишити це як коментар.
joeqwerty

Відповіді:


10

Правильне планування майбутніх завдань за місцевим часом з урахуванням часових поясів та літнього часу - дуже складна тема. Я писав про це раніше з точки зору програмування на Stack Overflow тут і тут .

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

  • Визначте свої схеми повторення за місцевим часом - не за 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 AM PDT та пропустіть наступне виникнення о 1:00 ранку PST тієї ж дати. (Знову ж, вам може знадобитися інша стратегія, наприклад, запуск у другому випадку або запуск обох. 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 Agent ще гірший тим, що він дозволяє використовувати лише час на локальному сервері. Знову ж, не можна вказати часові пояси, і ви також не можете вказати UTC.

Надіслано запит , але його не прийнято.


Отже, у нижньому рядку, з конкретними інструментами SQL Agent та Windows Task Scheduler, ви маєте зміни вручну, щоб вносити зміни кожного разу, чи не так? Або, можливо, код, який працює у планувальника, може повторно перевірити час UTC, а потім, можливо, зробити затримку (восени), але жодним чином уникнути того, щоб робота не була запущена навесні, крім ручної зміни. Або, можливо, сценарій, щоб насправді перепрограмувати графік?
NealWalters

Я оновив відповідь інформацією про планувальник завдань Windows та агент SQL. Жоден з них не робить все правильно. Якщо ви хочете розробити власне рішення, ви можете подивитися на Quartz.net .
Метт Джонсон-Пінт

За короткий термін ви можете скористатися Планувальником завдань Windows із цим полем, щоб встановити завдання, які потрібно виконувати в певний час UTC. Але ви, мабуть, хочете, щоб вони були одноразовими завданнями, які ви будуєте програмно з власного коду, щоб ви могли взяти до уваги інше.
Метт Джонсон-Пінт

Ще одна чудова відповідь!
NealWalters

1

Не піклуючись, взагалі.

Задайте питання "так що робити, якщо завдання виконується двічі?"

Взагалі це не має значення, тому нічого не потрібно робити. Якщо це має значення, найпростішим рішенням є переміщення роботи з години, на яку впливає зміна літнього часу.


Якби мені було все одно, я б не запитав. Деякі мають значення, деякі - ні. О 2:00 у нас є завдання, які витягують файл і надсилають його нашим постачальникам. Я не думаю, що 2:00 повториться. Ми перейдемо до 2:05 лише для додаткового страхування. У нас є резервні копії, розумні завдання в індексах тощо ... але, на щастя, вони пізніше.
NealWalters

1
@NealWalters Я вважаю, що це справедливо, щоб бути справедливим до безнадійного: Якщо це не має значення, якщо завдання виконується двічі, то чому турбуватися. Я не знаю про вас, але у мене є багато чого турбуватися, замість цього потрібно турбуватися, не турбуючись про речі, про які мені не потрібно хвилюватися. Якщо це має значення, то ви вже повинні кодувати його, щоб все одно перевірити обгрунтованість . Сказавши це, його, безумовно, хороша ідея уникати планування матеріалів для запуску в точну точку, коли годинники повертаються назад - це просто вимагає неприємностей.
Роб Моїр

Це не мій вибір, ми надсилаємо витяжні файли в аеропорти в той час ранку, і саме тоді вони хочуть файл. Ми використовуємо BizTalk, систему на основі повідомлень, тому важче повторно перевірити такі речі. Трохи розчаровує те, що планувальник завдань SQL та планувальник завдань Windows не передбачають щоденного часу UTC.
NealWalters

1

Як ви зазначали, година між 1 та 2 ранку повторюється в кінці DST; коли відбудеться зворотна зміна (початок DST), часи між 2:00 та 3:00 не відбудуться (і ваше завдання не запуститься). Ваші найкращі варіанти будуть

  • запустіть графік роботи до UTC
  • виконайте роботу за часом поза зміною (00:59 або 3:00)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.