#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));