【问题标题】:Most reliable way of comparing datetimes?比较日期时间的最可靠方法?
【发布时间】:2011-01-22 11:52:47
【问题描述】:

我主要在工作场所使用 Delphi,在一些涉及比较日期时间的彻底单元测试中,我发现在比较计算日期等时,使用 equals 运算符的直接比较不够可靠。所以我开始使用 CompareDateTimeSameDateTime 的规则,它们是 Delphi 中用于日期比较的内置函数。

在 C# 中,出于习惯,我使用标准运算符 =<> 比较日期/时间。我们有类似的函数,如 DateTime.CompareDateTime.Equals 用于日期时间比较,因此在准确性和可靠性方面我应该真的改用内置函数吗?

他们会给我一个比使用运算符更准确的比较吗?

【问题讨论】:

  • 请注意,如果减去 UTC 和本地时间戳,它将减去原始时间值。

标签: c# datetime reliability date-comparison


【解决方案1】:

鉴于您的日期/时间是计算出来的,您最好计算时间之间的差异,这会给您一个TimeSpan

TimeSpan travelTime = arrival - departure;

然后您可以检查这是否小于允许的容差。

if (Math.Abs(travelTime.TotalMilliseconds) < tolerance)
{
    // times are equal.
}

这类似于您需要对浮点值采取的方法,但与此无关,因为在这种情况下,不准确性源于您的数据而不是它在内存中的表示方式。

【讨论】:

  • 这也是我首先想到的。可以很好地封装到 DateTime 上的扩展方法中。
  • 所以我感到困惑的是......如果它们不可靠,为什么首先允许运算符比较?操作员究竟在 DateTimes 的幕后做了什么?
  • @James - 他们被允许的方式与float1 == float2 被允许的方式相同。这是语言的一部分。如果您只处理日期部分或 assigned 日期/时间,那么等式可能没问题,但计算出的时间会减少毫秒甚至秒,您 必须 拥有误差幅度。
  • 我明白了,如果没有计算日期但更多翻译例如使用 TimeZoneInfo.ConvertDate 之类的本地 DT 到 UTC DT,在这里简单地使用运算符进行比较会不会不可靠?
  • @James - 我认为最好的办法是进行一些实验,看看翻译过程中引入了哪些(如果有的话)错误。
【解决方案2】:

我不太确定,但我的一位同事告诉我要始终使用 Equals 运算符。对于 DateTime 对象,EqualsCompare 正在比较刻度。

如果您想了解更多关于 ChrisF 提到的TimeSpan 方法,请参阅here

【讨论】:

  • 没关系,我知道TimeSpan 的东西。只是想弄清楚使用运算符比较是否足够可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多