Вопрос

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

У меня есть куча задач, которые работают с разными частотами. У них также есть начало "семя" дата / время Начало семени когда-то в прошлом, может быть минуту назад, может быть 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top