2016-10-07 38 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)

絕對(16-22)模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));