计算下一次出现之前的毫秒数

时间:2013-06-29 18:11:53

标签: c#

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

我有一个时间(例如1800小时)存储在DateTime对象中。日期无效且无关紧要。我想知道的是那个时间的NEXT发生之前的几毫秒。

因此,如果我在0600运行计算 - 它将返回12小时(以毫秒为单位)。在1750,它将返回十分钟(以毫秒为单位),在1900年将返回24小时(以毫秒为单位)。

我能找到的所有东西都告诉我如何计算差异,一旦你超过时间就不会有效。

这是我尝试过的,但是一旦你超过时间就会失败并给出负值:

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

2 个答案:

答案 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