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