Расчет времени начала задачи - PullRequest
2 голосов
/ 01 августа 2009

У меня есть требование, которое выглядит следующим образом (поверьте мне, я слишком стар для домашней работы ухмылка )

У меня есть куча задач, которые работают на разных частотах. У них также есть стартовая «начальная» дата / время. Начало семени когда-то в прошлом, может быть минуту назад, может быть 5 лет назад.

Мне нужно рассчитать время следующего запуска для задачи, используя дату / время начального заполнения и частоту - это не может быть просто «сейчас» + частота задачи (для тех из вас, у кого запланированы задания на MS SQL Server) это знакомая концепция)

Теперь глупый способ сделать это - взять стартовое семя и продолжать добавлять частоту, пока она не станет больше, чем «сейчас». Это вряд ли оптимально. Наивным способом сделать это было бы взять начальную начальную дату, изменить ее на сегодняшнюю дату и оставить время как есть, затем добавить частоту, пока она не станет больше, чем сейчас, но это предполагает частоту, кратную 24 часам.

Так, каков лучший / самый быстрый способ сделать это? Бонусные баллы за решение C #, но это достаточно универсально, чтобы создать интересную головоломку для любого языка:)

Ответы [ 3 ]

6 голосов
/ 01 августа 2009

Лучшим методом было бы взять разность между начальной и текущей отметками времени, разделить ее на частоту, округлить полученный множитель до ближайшего целого числа, снова умножить на частоту и добавить ее к начальной отметке времени. еще раз.

Акт округления обеспечит правильное смещение.

0 голосов
/ 01 августа 2009

Интересная головоломка, спасибо за вызов:)

Это должно сделать это в c #. Почти наверняка можно похудеть, но достаточно многословно, чтобы объяснить, что происходит

// Initialise with date the event started, and frequency
DateTime startDate = new DateTime(2009, 8,1,9,0,0);
TimeSpan frequency = new TimeSpan(0, 15, 0);

// Store datetime now (so that it doesnt alter during following calculations)
DateTime now = DateTime.Now;

// Calculate the number of ticks that have occured since the event started
TimeSpan pastTimeSpan = now.Subtract(startDate);

// Divide the period that the event has been running by the frequency
// Take the remaining time span
TimeSpan remainingTimeSpan = new TimeSpan(pastTimeSpan.Ticks % frequency.Ticks);

// Calculate last occurence the event ran
DateTime lastOccurence = now.Subtract(remainingTimeSpan);

// Calculate next occurence the event will run
DateTime nextOccurence = lastOccurence.Add(frequency);
0 голосов
/ 01 августа 2009

Ваш ответ по существу будет таким:

next_time = ceiling((now - seed)/frequency) * frequency + seed

Использование функции потолка гарантирует, что next_time будет> = сейчас.

Вам нужно будет выполнить необходимые преобразования, чтобы выполнить эту арифметику с датами (например, перевести на время UNIX, которое является числом секунд с 1 января 1970 года.)

Я не знаком с C #, поэтому не могу предложить код, но я предполагаю, что C # имеет служебные классы даты / времени для работы с арифметическими операциями даты / времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...