c# - .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 值,而只是报告它们是不同的值。对我来说,这似乎完全错误。
谁能解释为什么它会这样工作?
解决方案
备注 为了确定当前实例与值的关系,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。
推荐阅读
- postgresql - VS 代码在正确的 sql 中显示不正确的语法错误
- python - PYTHON : ': [Errno 2] 没有这样的文件或目录py
- android - 从应用程序内的 ProcessBuilder 执行程序
- c++ - C++ 在地图中查找和更改值
- mongodb-query - 如何使用 $graphLookup 查询子参考模式集合
- django - pytesseract 从 pdf 读取自动生成的图像后 Django 应用程序崩溃
- c++ - C ++如何从模块中正确打印模板类型的值
- c# - 如何在发布中包含相关项目的依赖项
- git - GIT 错误“提示:等待编辑器关闭文件
- linux - 如何查询每个进程的 GPU 处理负载?