首页 > 解决方案 > .NET 中的 DateTime 时区似乎是错误的?

问题描述

我一直在DateTime从 .NET MVC 中解析字符串获得一些乐趣,并且我发现了一些奇怪的行为。看看这个测试:

[Test]
public void DoesItWork()
{
    DateTime theTime = DateTime.Now;
    DateTime theUTCTime = theTime.ToUniversalTime();
    Assert.IsTrue(theTime==theUTCTime);         
}

我现在在英国,而且是英国夏令时,所以我预计 UTC 时间会比DateTime.Now. 就是这样。但是当我调用.ToUniversalTime()我的初始日期时间并减去一个小时时,该值的 Kind 属性也会更新 - 从 Local 到 Utc。这也是我所期望的。

但是当我来比较这两个DateTime变量的值时,相等运算符没有考虑不同的 Kind 值,而只是报告它们是不同的值。对我来说,这似乎完全错误。

谁能解释为什么它会这样工作?

标签: c#.netdatetimedatetime-format

解决方案


根据MSDNMSDN2比较两个 DateTime 值时:

备注 为了确定当前实例与值的关系,CompareTo 方法将当前实例的 Ticks 属性与值进行比较,但忽略它们的 Kind 属性。在比较 DateTime 对象之前,请确保对象代表同一时区的时间。您可以通过比较它们的 Kind 属性的值来做到这一点。

备注 Equality 运算符通过比较它们的刻度数来确定两个 DateTime 值是否相等。在比较 DateTime 对象之前,请确保对象代表同一时区的时间。您可以通过比较它们的 Kind 属性的值来做到这一点。

所以是正确的。

链接到DateTime.Kind 属性并再次从备注中:

Kind 属性允许 DateTime 值清楚地反映协调世界时 (UTC) 或本地时间。相反,DateTimeOffset 结构可以明确地将任何时区中的任何时间反映为单个时间点。

更新

关于你的评论。恕我直言,这是预期的行为。因为通常,您不需要比较来自不同时区的两个 DateTime。如果你需要这样做,你必须使用 DateTimeOffset DateTimeOffset 结构,它是:

备注 DateTimeOffset 结构包括一个 DateTime 值以及一个 Offset 属性,该属性定义当前 DateTimeOffset 实例的日期和时间与协调世界时 (UTC) 之间的差异。因为它准确地定义了相对于 UTC 的日期和时间,DateTimeOffset 结构不像 DateTime 结构那样包含 Kind 成员。它表示日期和时间,其 UTC 值的范围从 0001 年 1 月 1 日午夜 12:00:00 到公元 9999 年 12 月 31 日 (CE) 晚上 11:59:59。


推荐阅读