Расчет времени начала задачи
-
06-07-2019 - |
Вопрос
У меня есть следующее требование (поверьте мне, я слишком стар для домашней работы ухмылка )
У меня есть куча задач, которые работают с разными частотами. У них также есть начало "семя" дата / время Начало семени когда-то в прошлом, может быть минуту назад, может быть 5 лет назад. Р>
Мне нужно рассчитать время следующего запуска для задачи, используя дату / время начала семени и частоту - это не может быть просто "сейчас" + частота выполнения задач (для тех из вас, у кого запланированы задания на MS SQL Server, это знакомая концепция)
Теперь глупый способ сделать это - взять начальное начальное число и продолжать добавлять частоту, пока она не станет больше, чем «сейчас». Это вряд ли оптимально. Наивный способ сделать это состоит в том, чтобы взять начальную начальную дату, изменить ее на сегодняшнюю дату и оставить время как есть, а затем добавить частоту, пока она не станет больше, чем сейчас, но при этом предполагается, что частота кратна 24 часам. / р>
Так, каков лучший / самый быстрый способ сделать это? Бонусные баллы за решение C #, но это достаточно универсально, чтобы создать интересную головоломку для любого языка:)
Решение
Лучшим способом было бы взять разницу между начальной отметкой времени и текущей отметкой времени, разделить ее на частоту, округлить полученный множитель до ближайшего целого числа, снова умножить на частоту и добавить ее к начальной отметке времени еще раз.
Акт округления обеспечит правильное смещение.
Другие советы
Ваш ответ по сути будет следующим:
next_time = ceiling((now - seed)/frequency) * frequency + seed
Использование функции потолка гарантирует, что next_time будет > = сейчас.
Вам нужно будет выполнить необходимые преобразования, чтобы выполнить эту арифметику с датами (например, перевести на время UNIX, которое является числом секунд с 1 января 1970 года.)
Я не знаком с C #, поэтому не могу предложить код, но я предполагаю, что C # имеет вспомогательные классы даты / времени для работы с арифметическими операциями даты / времени.
Интересная головоломка, спасибо за вызов :)
Это должно сделать это в 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);