.NET中的DateTime时区似乎是错误的?

时间:2018-06-14 16:55:03

标签: c# .net datetime datetime-format

我从.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值,只是报告它们是不同的值。对我而言,这似乎是错误的。

任何人都可以通过这种方式阐明原因吗?

1 个答案:

答案 0 :(得分:4)

根据MSDNMSDN2比较两个DateTime值:

  

备注   要确定当前实例与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。)。