为啥 DateTime.UtcNow.Subtract 有时会给我一个很大的数字?

Posted

技术标签:

【中文标题】为啥 DateTime.UtcNow.Subtract 有时会给我一个很大的数字?【英文标题】:Why does DateTime.UtcNow.Subtract give me a massive number sometimes?为什么 DateTime.UtcNow.Subtract 有时会给我一个很大的数字? 【发布时间】:2019-09-28 11:58:13 【问题描述】:

为什么 DateTime.Subtract 有时会返回非常奇怪的值?

private ConcurrentDictionary<string, Request> _waitingList = new ConcurrentDictionary<string, Request>();

// send requests in thread #1 and set their SentAt time
_waitingList.TryAdd(macAddress, request);
request.SentAt = DateTime.UtcNow;

// then in a timer tick event in different thread every 5 seconds
private void OnTimerTick(object sender, ElapsedEventArgs e) 
   foreach (var waiting in _waitingList)  // ConcurrentDictionary<string, Request>
      var request = waiting.Value;
      var msSinceSent = DateTime.UtcNow.Subtract(request.SentAt).TotalMilliseconds;
        Debug.WriteLine($"sent *request.Type* msSinceSent ms ago");
   

sent *PackageUpdate* 336.2019 ms ago
sent *PackageUpdate* 698.1145 ms ago
sent *PackageUpdate* 1059.864 ms ago
sent *PackageUpdate* 63693095680615.5 ms ago

最后一个值是巨大的,我经常得到这些,甚至无法理解这是怎么可能的。

【问题讨论】:

request.SentAt是什么数据类型? @DavidG 日期时间 你确定你使用的是.Milliseconds而不是.TotalMilliseconds吗? @DavidG 是的,对不起,我正在使用 .TotalMilliseconds,我在最后一分钟刚刚更改了它。我已经用所有细节更新了我的问题,但没有太多。 【参考方案1】:

如果request.SentAt 设置为DateTime.MinValue,您将获得该值。我假设它在您的数据存储中为 null 或零,并且正在某个地方转换为 DateTime.MinValue

例如这段代码:

Console.WriteLine(DateTime.UtcNow.Subtract(DateTime.MinValue).TotalMilliseconds);

会输出这个值:

63693097183442.7

【讨论】:

以上是关于为啥 DateTime.UtcNow.Subtract 有时会给我一个很大的数字?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?