Как рассчитать временные интервалы, используя модульную арифметику?

#c# #modulo #timespan #modular-arithmetic

#c# #modulo #временные интервалы #модульная арифметика

Вопрос:

Этот вопрос в основном касается представления концепции модульной арифметики в коде и использования знака по модулю.

Итак, недавно я сделал всплывающее окно для установки SCCM, которое должно дать пользователю время для установки приложения, требования клиента заключались в том, чтобы показать пользователю часы с указанием времени, оставшегося до установки (или позволить пользователю установить сейчас). Количество времени на часах, которое они хотели, составляло 24 часа, плюс все время, оставшееся до 4 вечера, когда 24 часа прошли так:

программа запускается в 13:00, затем на часах должно отображаться 24 3 = 27 часов

когда 16:00, это должно быть 24 24, что составляет 48 часов

когда 22:00, это должно быть 24 18, что составляет 42 часа

Теперь я заметил, что:

13 27 = 40

16 24 = 40

22 18 = 40

40 Modulo 24 = 16

Итак, в принципе, если я вычту текущее время из 40, у меня останется разница:

40 — 13 = 27

40 — 16 = 24

40 — 22 = 18

Итак, что я сделал, это:

 //I need to make a timespan object which has 24 hours from current time   time left to the next 4pm

//The context is time to install, which user should see
Timespan TimeToInstall = new Timespan(23,59,59)

DateTime Now = DateTime.Now;
if (Now.Hour < 16)
{
    long TimeTo4 = (new TimeSpan(40, 0, 0).Ticks - Now.TimeOfDay.Ticks);
    TimeToInstall = TimeSpan.FromTicks(TimeTo4);
}
else
{

long TimeTo4 = (new TimeSpan(40, 0, 0).Ticks - Now.TimeOfDay.Ticks)   TimeGiven.Ticks;
TimeToInstall = TimeSpan.FromTicks(TimeTo4);

}
  

Проблема с приведенным выше решением заключается в том, что я знаю, что оно может быть короче, потому что, когда я вычитаю время раз до 4 часов вечера, мне не нужно добавлять 24 часа, если время выполнения больше или равно 4 часам вечера, тогда мне нужно добавить 24 часа. У меня есть приблизительное представление о том, как реорганизовать это в математике / псевдокоде, например:

абсолютное (16-13) по модулю 24 = 3

абсолютное (16-16) по модулю 24 = 0 (24)

абсолютное (16-22) по модулю 24 = 18

Вопрос в том, как это сделать в коде C # для рефакторинга этого кода? Пожалуйста, используйте любой язык, который вам нравится, но я был бы очень полезен для примера C #. Спасибо, ребята

Комментарии:

1. @Prix это вопрос о том, как что-то сделать в коде, а не вопрос для проверки кода, я просто добавляю его туда дополнительно.

Ответ №1:

Если вы ищете более короткое решение, как насчет этого?

 public static int HoursUntilDueTime(DateTime time)
{
    DateTime dueTime = (time   TimeSpan.FromHours(8)).Date   TimeSpan.FromHours(24   16);
    return (int)(0.5   (dueTime - time).TotalHours);
}
  

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

 public static int HoursUntilDueTime(DateTime currentTime, DateTime targetTime)
{
    DateTime dueTime = (currentTime   TimeSpan.FromHours(24 - targetTime.Hour)).Date   TimeSpan.FromHours(24   targetTime.Hour);
    return (int)(0.5   (dueTime - currentTime).TotalHours);
}
  

Тестовый код:

 var targetTime = new DateTime(2000, 1, 1, 16, 00, 00);
Console.WriteLine(HoursUntilDueTime(new DateTime(2016, 1, 1, 13, 00, 00), targetTime));
Console.WriteLine(HoursUntilDueTime(new DateTime(2016, 1, 1, 16, 00, 00), targetTime));
Console.WriteLine(HoursUntilDueTime(new DateTime(2016, 1, 1, 22, 00, 00), targetTime));