Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# new DateTime()和DateTime.Parse的不同结果_C#_Datetime - Fatal编程技术网

C# new DateTime()和DateTime.Parse的不同结果

C# new DateTime()和DateTime.Parse的不同结果,c#,datetime,C#,Datetime,在C#的单元测试中,我注意到一些奇怪的行为 给定以下代码: var dateTime = DateTime.Parse("01/01/2015"); Assert.AreEqual(dateTime, new DateTime(2015, 1, 1)); 我得到一个失败的测试结果: Expected: 2015-01-01 00:00:00.000 But was: 01/01/2015 00:00:00 +00:00 我尝试在这两个方面调用ToString(),传入CultureInfo

在C#的单元测试中,我注意到一些奇怪的行为

给定以下代码:

var dateTime = DateTime.Parse("01/01/2015");
Assert.AreEqual(dateTime, new DateTime(2015, 1, 1));
我得到一个失败的测试结果:

Expected: 2015-01-01 00:00:00.000
But was:  01/01/2015 00:00:00 +00:00
我尝试在这两个方面调用
ToString()
,传入
CultureInfo.CurrentCulture
,并在新的DateTime调用中将DateKind设置为Local和UTC,但得到的结果是相同的


为什么这两种方法的结果不一样呢?

我想尝试一下:

Assert.IsTrue(DateTime.Compare(DateTime.Parse("01/01/2015"), new DateTime(2015, 1, 1) == 0); 

永远不要将日期硬编码为字符串。做这件事有什么意义

DateTime.Parse("01/01/2015")
而是这样做:

new DateTime(2015,1,1)
Parse默认使用当前区域性创建日期。考虑下面的例子:

DateTime.Parse("09/06/2015");
是6月9日还是9月6日?根据您的机器文化,您将获得不同的结果。若DateTime字符串来自某个地方,那个么可以强制解析方法使用特定的格式/区域性


回到问题上来,这可能与文化有关

在简化示例中,问题假设第一个变量是DateTime,而实际上是DateTimeOffset。生成该变量的公共方法已经更改,我错误地认为返回类型仍然是DateTime

所以他们给出不同结果的原因是因为他们是不同的

第一课:即使你知道类型是什么,也要检查类型。
第二课:不要在这么多有问题的例子中简化太多。

。必须是您没有显示的内容。您的测试框架是什么,断言的签名是什么。AreEqual-它需要
对象
日期时间
字符串
还是其他什么?Defo在NUnit中工作,但您用什么进行测试?你能再加一句吗tag@DieVeenman不可能。DateTime是DateTime,没有歧义。只有ToString会产生不同的结果(潜在的问题可能是日期和月份的混合,但在本例中这并不重要),只是为了排除其他问题(例如,引用相等),Assert.AreEqual(新日期时间(2015,1,1),新日期时间(2015,1,1))?虽然这可能解决了问题,但它并没有真正回答问题:“为什么这两种方法不能给出相同的结果?”因为它在日期时间上使用AreEquals可能不会使用适当的比较器,但是,由于我不确定,我更愿意获得OP的反馈,以进一步解释“这样做有什么意义?”也许单元测试是在文本框中模拟用户输入?@JamesThorpe-bang-on。实际上,它是从数据库表中提取值,但对于单元测试,我正在模拟该位,因为单元测试。@petethepagangerbil您应该为DateTime.Parse指定区域性或支持的格式列表,以避免混淆。单元测试应该是deterministic@Zbigniew当我这样做时,我得到了相同的结果(如问题中所述)。@Petthepagan沙鼠我现在无法测试它,因为我没有安装NUnit,但我假设下面会发生这样的事情:(object)dateTime==(object)new dateTime(2015,1,1)这只是一个猜测,您是否尝试将其与Assert.That(d1,即.EqualTo(d2))进行比较?