[英]How to calculate timespans using modular arithmetic?
這個問題基本上是關於在代碼中表示模算術概念和使用模符號。
所以最近我做了一個 SCCM 安裝的彈出窗口,它應該給用戶時間來安裝一個應用程序,客戶端的要求是向用戶顯示一個時鍾,上面有安裝剩余的時間(或者讓用戶現在安裝)。 他們想要的時鍾上的時間是 24 小時,加上 24 小時過去后剩下的時間到下午 4 點,所以:
程序在 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)
絕對 (16-22) 模 24 = 18
問題是如何在C#代碼中重構這段代碼? 請使用您喜歡的任何語言,但我會非常喜歡 C# 示例。 謝謝你們
如果您正在尋找更短的解決方案,這個怎么樣?
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.