C# 计算距离下一次出现时间的毫秒数

C# 计算距离下一次出现时间的毫秒数,c#,C#,我觉得这很简单,但我的谷歌Fu让我失望,因为我一直在寻找差异计算 我在DateTime对象中存储了一个时间(例如1800小时)。该日期无效且不重要。我只想知道离下一次发生还有多少毫秒 因此,如果我在0600运行计算,它将返回12小时(毫秒)。1750时返回10分钟(毫秒),1900时返回24小时(毫秒) 我能找到的所有东西都告诉我如何计算差异,一旦你过了时间,这就行不通了 以下是我尝试过的,但一旦你过了时间就失败了,并给出了负值: DateTime nowTime = DateTime.Now;

我觉得这很简单,但我的谷歌Fu让我失望,因为我一直在寻找差异计算

我在
DateTime
对象中存储了一个时间(例如1800小时)。该日期无效且不重要。我只想知道离下一次发生还有多少毫秒

因此,如果我在0600运行计算,它将返回12小时(毫秒)。1750时返回10分钟(毫秒),1900时返回24小时(毫秒)

我能找到的所有东西都告诉我如何计算差异,一旦你过了时间,这就行不通了

以下是我尝试过的,但一旦你过了时间就失败了,并给出了负值:

DateTime nowTime = DateTime.Now;
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay;
double result = difference.TotalMilliseconds;

你已经在做你应该做的一切,除了一件事:处理负面结果

如果结果为负数,则表示要计算持续时间的时间已经过去,然后希望它表示“明天”,并获得正值

在这种情况下,只需添加24小时:

DateTime nowTime = DateTime.Now;
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay;
double result = difference.TotalMilliseconds;
if (result < 0)
    result += TimeSpan.FromHours(24).TotalMilliseconds;
但是,请注意,这将容易出现浮点值的常见问题。如果当前时间为18:59:59.9999999,您仍然希望它将当前时间(时间的一小部分)返回到今天19:00,还是希望它切换到明天?如果是,请将比较更改为稍有不同:

DateTime nowTime = DateTime.Now;
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay;
double result = difference.TotalMilliseconds;
if (result <= -0.0001)
    result += TimeSpan.FromHours(24).TotalMilliseconds;
DateTime nowTime=DateTime.Now;
时间跨度差=_.TimeOfDay-nowTime.TimeOfDay;
double result=difference.totalms;

如果(结果进行此类计算时,重要的是考虑可能的DST变化,以便结果保持正确

假设您的操作参数为:

var shutdownTime = TimeSpan.FromHours(18);
// just to illustrate, in Europe there is a DST change on 2013-10-27
// normally you 'd just use DateTime.Now here
var now = new DateTime(2013, 10, 26, 20, 00, 00);

// do your calculations in local time
var nextShutdown = now.Date + shutdownTime;
if (nextShutdown < now) {
    nextShutdown = nextShutdown.AddDays(1);
}

// when you want to calculate time spans in absolute time
// (vs. wall clock time) always convert to UTC first
var remaining = nextShutdown.ToUniversalTime() - now.ToUniversalTime();
Console.WriteLine(remaining);
var shutdown=TimeSpan.FromHours(18);
//举例来说,2013年10月27日,欧洲的DST发生了变化
//通常你只需要使用DateTime。现在在这里
var now=新的日期时间(2013,10,26,20,00,00);
//你在当地时间计算吗
var nextShutdown=now.Date+shutdown;
如果(下一次关机<现在){
nextShutdown=nextShutdown.AddDays(1);
}
//当您要以绝对时间计算时间跨度时
//(相对于挂钟时间)始终先转换为UTC
var remaining=nextShutdown.ToUniversalTime()-now.ToUniversalTime();
控制台写入线(剩余);

现在,您的问题的答案是剩余。TotalMillimess

顺便说一句,日期不是空的,也不重要,因为它可能是午夜,并且那天可能有计划的DST更改。当您说“不工作”时,你这是什么意思?你说你找到了显示如何计算差异的代码,你能显示该代码吗?不,不是。如果下一个事件被定义为“今天的下一个事件,或者如果我们今天已经过了那个时间,明天的下一个事件”,则该值显然不是无用的。它是指如果将24小时添加到该值中,它的确切时间长度。换句话说,如果该值为正,则表示到今天的正确时间为止的时间长度。如果该值为负,则添加24小时(
TimeSpan.FromHours(24)
)使用
TimeSpan
?但是,你已经在使用它了,因为
TimeOfDay
返回一个
TimeSpan
。这里的问题是你要求.NET从14:00小时减去18:00小时,并期望它产生一个正的差异。这不会发生笔。你需要处理时间已经过去的场景,并要求它计算第二天的时间,正如我指出的,如果结果为负,你只需在结果上加上24小时即可。这太棒了-我真的很感谢你花时间在这方面。由于DST,这种方法并不总是正确的。一般来说,只要你发现你自己将固定时间跨度添加到
DateTime
你正在编写一个DST错误。因为他专门处理时间,我想说这不是问题,但如果你涉及日期,你当然是对的。还要注意,我并不是真的将固定时间跨度添加到DateTime,我是在添加一个不同的时间跨度,但这是语义,根据您的评论,这里的问题是负号。我想说,如果您试图处理DST和.NET日期和时间类型,您只会编写错误。实际上,如果您将本地时间转换为UTC,并使用UTC日期进行所有计算,您可以避免这些问题。本地时间应仅用于输入和输出。在内部,一个始终与UTC合作。转换将处理DST问题。谢谢Jon。这对于我的目的(著名的遗言)应该是无关紧要的,但知道这一点很好。
var shutdownTime = TimeSpan.FromHours(18);
// just to illustrate, in Europe there is a DST change on 2013-10-27
// normally you 'd just use DateTime.Now here
var now = new DateTime(2013, 10, 26, 20, 00, 00);

// do your calculations in local time
var nextShutdown = now.Date + shutdownTime;
if (nextShutdown < now) {
    nextShutdown = nextShutdown.AddDays(1);
}

// when you want to calculate time spans in absolute time
// (vs. wall clock time) always convert to UTC first
var remaining = nextShutdown.ToUniversalTime() - now.ToUniversalTime();
Console.WriteLine(remaining);