Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中的DateTime时区似乎是错误的?_C#_.net_Datetime_Datetime Format - Fatal编程技术网

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

C# NET中的DateTime时区似乎是错误的?,c#,.net,datetime,datetime-format,C#,.net,Datetime,Datetime Format,在.NETMVC中,我对DateTime解析字符串一直很感兴趣,我发现了一些奇怪的行为。看看这个测试: [Test] public void DoesItWork() { DateTime theTime = DateTime.Now; DateTime theUTCTime = theTime.ToUniversalTime(); Assert.IsTrue(theTime==theUTCTime); } 我现在在英国,英国夏令时,所以我预计UTC时

在.NETMVC中,我对
DateTime
解析字符串一直很感兴趣,我发现了一些奇怪的行为。看看这个测试:

[Test]
public void DoesItWork()
{
    DateTime theTime = DateTime.Now;
    DateTime theUTCTime = theTime.ToUniversalTime();
    Assert.IsTrue(theTime==theUTCTime);         
}
我现在在英国,英国夏令时,所以我预计UTC时间比
DateTime.now
的值晚一个小时。的确如此。但是,当我在初始日期时间调用
.ToUniversalTime()
以及减去一小时时,该值的Kind属性也会更新,从Local到Utc。这也是我所期望的

但是,当我比较这两个
DateTime
变量的值时,等式运算符没有考虑不同种类的值,只是报告它们是不同的值。在我看来,这完全是错误的

有人能解释为什么它是这样工作的吗?

根据和比较两个日期时间值:

评论 要确定当前实例与值的关系,CompareTo方法将比较当前实例和值的Ticks属性,但忽略它们的Kind属性。在比较DateTime对象之前,请确保这些对象表示同一时区中的时间。您可以通过比较其种类属性的值来实现这一点

评论 相等运算符通过比较两个日期时间值的刻度数来确定它们是否相等。在比较DateTime对象之前,请确保这些对象表示同一时区中的时间。您可以通过比较其种类属性的值来实现这一点

所以这是正确的

链接到并再次从备注中删除:

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

更新

关于你的评论。我不知道这是什么行为。因为通常情况下,您不需要比较来自不同时区的两个日期时间。如果需要执行此操作,则必须使用DateTimeOffset,即:

评论 DateTimeOffset结构包括一个DateTime值,以及一个Offset属性,该属性定义当前DateTimeOffset实例的日期和时间与协调世界时(UTC)之间的差异。由于DateTimeOffset结构精确定义了相对于UTC的日期和时间,因此它不像DateTime结构那样包含种类成员。它表示日期和时间,UTC的值范围为公元0001年1月1日午夜12:00:00(普通纪元)到9999年12月31日下午11:59:59(公元前)


因为事情就是这样?“如果当前实例和值的Ticks属性值相等,则它们是相等的。在相等性测试中不考虑它们的Kind属性值。”您是否断言对象是dateTime的?如果你比较一下时间,你期待什么?有一种称为TimeZoneInfo的类型可以为您提供日期计算。对于信息,DateTimeOffset的行为方式相同(即,两个具有相同UTC的“不同”DateTimeOffset被认为是相等的),因此您在这方面没有任何优势。NUnit允许您在DateTimeOffset的IsEqual约束上指定WithSameOffset,以使比较包括偏移量。您可以对DateTimes使用SameKind,如(在该页末尾附近)中所示。好的,是的,我同意您所描述的文档化。你不认为这在逻辑上是错误的吗?如果您要包含一个Kind实例属性,那么它肯定应该是比较的一部分——或者如果不是,那么有理由不这样做。