我觉得这很简单,但我的Google Fu让我失望,因为我一直在寻找差异计算。
我有一个时间(例如1800小时)存储在DateTime
对象中。日期无效且无关紧要。我想知道的是那个时间的NEXT发生之前的几毫秒。
因此,如果我在0600运行计算 - 它将返回12小时(以毫秒为单位)。在1750,它将返回十分钟(以毫秒为单位),在1900年将返回24小时(以毫秒为单位)。
我能找到的所有东西都告诉我如何计算差异,一旦你超过时间就不会有效。
这是我尝试过的,但是一旦你超过时间就会失败并给出负值:
DateTime nowTime = DateTime.Now;
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay;
double result = difference.TotalMilliseconds;
答案 0 :(得分:4)
你已经做了你应该做的一切,除了一件事:处理负面结果。
如果结果是否定的,则表示您希望计算持续时间直到已经过去的时间,然后您希望它代表“明天”,并获得正值。< / p>
在这种情况下,只需添加24小时:
DateTime nowTime = DateTime.Now;
TimeSpan difference = _shutdownTime.TimeOfDay - nowTime.TimeOfDay;
double result = difference.TotalMilliseconds;
if (result < 0)
result += TimeSpan.FromHours(24).TotalMilliseconds;
接下来要考虑的是:如果您想要计算持续时间的时间是19:00小时,而当前时间正好 19:00小时,您是否希望它返回0(零)或24小时的时间?意思是,你真的想要 next 这样的事吗?
如果是,请将上述if
- 语句更改为使用<=
:
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;
其中-0.0001
是一个值,对应于“您准备接受明天 而不是今天以毫秒为单位的不准确范围”
答案 1 :(得分:2)
在进行这样的计算时,重要的是要考虑可能的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);
您的问题的答案现在是remaining.TotalMilliseconds
。