2016-10-07 12 views
-1

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

Так недавно я сделал всплывающее окно для установки 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 Модульное 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)

absolute (16-22) modulo 24 = 18

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

+0

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