Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用模运算计算时间跨度?_C#_Modulo_Timespan_Modular Arithmetic - Fatal编程技术网

C# 如何使用模运算计算时间跨度?

C# 如何使用模运算计算时间跨度?,c#,modulo,timespan,modular-arithmetic,C#,Modulo,Timespan,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 所

这个问题基本上是关于在代码中表示模算术概念和使用模符号

因此,最近我为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);

}
//我需要创建一个timespan对象,该对象从当前时间+剩余时间到下一个下午4点有24小时
//上下文是安装的时间,用户应该看到它
Timespan TimeToInstall=新的Timespan(23,59,59)
DateTime Now=DateTime.Now;
如果(现在。小时<16)
{
longtimeto4=(新的时间跨度(40,0,0).Ticks-Now.TimeOfDay.Ticks);
TimeToInstall=TimeSpan.FromTicks(TimeTo4);
}
其他的
{
longtimeto4=(新的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);
}
或者,如果要传入目标时间(忽略日期部分):

测试代码:

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));

@Prix这是一个如何在代码中做一些事情的问题,不是一个代码审查的问题,我只是把它附加在那里。
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));