Ted*_*Ted 5 .net c# datetime datetime-format
我一直在DateTime从 .NET MVC 中的字符串解析中获得一些乐趣,并且我发现了一些奇怪的行为。看看这个测试:
[Test]
public void DoesItWork()
{
DateTime theTime = DateTime.Now;
DateTime theUTCTime = theTime.ToUniversalTime();
Assert.IsTrue(theTime==theUTCTime);
}
Run Code Online (Sandbox Code Playgroud)
我现在在英国,并且是 BST,因此我预计 UTC 时间比 的值晚一个小时DateTime.Now。确实如此。但是,当我调用.ToUniversalTime()初始日期时间并减去一个小时时,该值的 Kind 属性也会更新 - 从 Local 到 Utc。这也是我所期待的。
但是当我比较这两个DateTime变量的值时,相等运算符不会考虑不同的 Kind 值,而只是报告它们是不同的值。对我来说,这似乎完全错误。
任何人都可以解释为什么它会这样工作吗?
根据MSDN和MSDN2,当您比较两个 DateTime 值时:
备注 为了确定当前实例与值的关系,CompareTo 方法将比较当前实例的 Ticks 属性和值,但忽略它们的 Kind 属性。在比较 DateTime 对象之前,请确保这些对象表示同一时区的时间。您可以通过比较它们的 Kind 属性的值来做到这一点。
备注 Equality 运算符通过比较两个 DateTime 值的刻度数来确定它们是否相等。在比较 DateTime 对象之前,请确保这些对象表示同一时区的时间。您可以通过比较其 Kind 属性的值来做到这一点。
所以这是正确的。
链接到DateTime.Kind 属性并再次从注释中链接:
Kind 属性允许 DateTime 值清楚地反映协调世界时 (UTC) 或本地时间。相比之下,DateTimeOffset 结构可以明确地将任何时区的任何时间反映为单个时间点。
更新
关于你的评论。恕我直言,这是预期的行为。因为通常情况下,您不需要比较来自不同时区的两个日期时间。如果您需要这样做,则必须使用 DateTimeOffset DateTimeOffset 结构,它是:
备注 DateTimeOffset 结构包含一个 DateTime 值以及一个 Offset 属性,该属性定义当前 DateTimeOffset 实例的日期和时间与协调世界时 (UTC) 之间的差异。因为它精确定义了相对于 UTC 的日期和时间,所以 DateTimeOffset 结构不像 DateTime 结构那样包含 Kind 成员。它表示日期和时间,其值的 UTC 范围为公元 0001 年 1 月 1 日午夜 12:00:00 到公元 9999 年 12 月 31 日晚上 11:59:59。