我从.NET MVC中的字符串解析DateTime
获得了一些乐趣,我发现了一些奇怪的行为。看看这个测试:
[Test]
public void DoesItWork()
{
DateTime theTime = DateTime.Now;
DateTime theUTCTime = theTime.ToUniversalTime();
Assert.IsTrue(theTime==theUTCTime);
}
我现在在英国及其BST,所以我希望UTC时间比DateTime.Now
的价值落后一小时。就是这样。但是当我在初始日期时间调用.ToUniversalTime()
以及减去一小时时,值的Kind属性也会更新 - 从Local到Utc。这也是我所期待的。
但是当我来比较这两个DateTime
变量的值时,相等运算符没有考虑不同的Kind值,只是报告它们是不同的值。对我而言,这似乎是错误的。
任何人都可以通过这种方式阐明原因吗?
答案 0 :(得分:4)
备注 要确定当前实例与value的关系,CompareTo方法会比较当前实例的Ticks属性和值,但忽略其Kind属性。在比较DateTime对象之前,请确保对象表示同一时区中的时间。您可以通过比较其Kind属性的值来完成此操作。
备注 Equality运算符通过比较它们的滴答数来确定两个DateTime值是否相等。在比较DateTime对象之前,请确保对象表示同一时区中的时间。您可以通过比较Kind属性的值来完成此操作。
所以这是对的。
链接到DateTime.Kind Property,再次从评论中链接:
Kind属性允许DateTime值清楚地反映协调世界时(UTC)或当地时间。相比之下,DateTimeOffset结构可以明确地将任何时区中的任何时间反映为单个时间点。
<强>更新强>
关于你的评论。恕我直言,这是预期的行为。因为通常,您不需要比较来自不同时区的两个日期时间。如果你需要这样做,你必须使用DateTimeOffset DateTimeOffset Structure,即:
备注 DateTimeOffset结构包括DateTime值以及Offset属性,该属性定义当前DateTimeOffset实例的日期和时间与协调世界时(UTC)之间的差异。因为它确切地定义了相对于UTC的日期和时间,所以DateTimeOffset结构不包含Kind成员,就像DateTime结构那样。它表示日期和时间,其值的UTC范围为0001年1月1日午夜,1月1日,000 Anno Domini(公共时代),到公元9999年12月31日晚上11:59:59。(C.E。)。