簡體   English   中英

如何使用模算術計算時間跨度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM