【问题标题】:Comparing DateTimes with Unspecified and UTC kinds将 DateTimes 与未指定和 UTC 类型进行比较
【发布时间】:2013-07-16 03:39:05
【问题描述】:

我有 2 个DateTime 值:

date1

date2

比较这两个日期时,两个日期相等。

if (DateTime.Compare(date1, date2)!=0)
    ...

谁能解释一下原因?

对我来说有点奇怪:将 date1(未指定类型)转换为 UTC 时,我清楚地看到日期不同:

date1.ToUniversalTime() --> {15-07-13 18:45:10} 类型 = UTC

【问题讨论】:

  • 作为一种变通方法,您可能想要编写一个自定义比较器,例如 public class FullDateTimeEqualityComparer : EqualityComparer<DateTime> { public override bool Equals(DateTime dt1, DateTime dt2) { return dt1.Kind == dt2.Kind && dt1 == dt2; } public override int GetHashCode(DateTime dt) { return dt.Kind.GetHashCode() ^ dt.GetHashCode(); } }
  • 关于转换的最后一点。未指定的转换很棘手...如果您要转换 ToLocalTime 它假定它是 UTC。而且,反之亦然,如果您要转换 ToUniversalTime 它假定它是本地的。因此,无论哪种方式都会发生转化。

标签: c# datetime


【解决方案1】:

有人能解释一下为什么吗?

是的。这是因为DateTime is a fundamentally broken type,国际海事组织。基本上Kind 不用于比较。这样做很可能会破坏旧代码,而且它并不总是你想要的。它是为 .NET 1.1 添加的,但并不总是以一种很好的方式 - 正如您在比较中看到的那样,它绝对没有以您可能期望的所有方式完全集成。

作为另一个例子,即使是LocalKind(这意味着是系统本地时区),它也会被算术忽略,这意味着调用AddHours(1) 实际上只会增加本地时间,而不是它代表经过时间(可能最终是相同的当地时间或两个小时后的当地时间,在 DST 转换前后)。

我的建议是首先避免比较不同类型的DateTime 值。这几乎不是你想做的。

(当然我也推荐使用Noda Time,但那是一个稍微不同的问题。)

【讨论】:

  • DateTimeOffset 在这里也能更好地工作(为此特定目的)
  • @MattJohnson:有可能。虽然对于KindUnspecifiedDateTimeOffset 真的很奇怪......
  • 哦,是的,你是对的。看,它是如此的 FUBAR,即使我有时会弄错...... :)
  • @MattJohnson:就好像我们需要不同类型的“本地日期和时间”、“特定时区的日期和时间”、“仅具有特定偏移量的日期和时间”等。为什么以前没有打动我? ;)
  • 哈哈!说到这里,我今天偶然发现了something very interesting。虽然我认为this article 与这个特定问题更相关。
【解决方案2】:

来自DateTimeKind 上的文档(重点是我的):

DateTimeKind 枚举的成员用于转换 本地时间和协调世界时 (UTC) 之间的操作, 但不是比较或算术运算

【讨论】:

  • 要详细说明这一点,这意味着如果您居住在 UTC-5 时区并将 DateTime.Now 与 DateTime.UtcNow 进行比较,您会看到 TimeSpan 为 5 小时区别。
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 2018-11-08
  • 1970-01-01
  • 2015-01-31
  • 2019-05-28
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多