繁体   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