我在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,但我得到了相同的结果。
为什么这两种方法不能给出相同的结果?
答案 0 :(得分:1)
我会用:
拍摄Assert.IsTrue(DateTime.Compare(DateTime.Parse("01/01/2015"), new DateTime(2015, 1, 1) == 0);
答案 1 :(得分:0)
您永远不应该将日期硬编码为字符串。这样做有什么意义?
DateTime.Parse("01/01/2015")
而是这样做:
new DateTime(2015,1,1)
DateTime.Parse默认使用您当前的文化来创建日期。请考虑以下示例:
DateTime.Parse("09/06/2015");
是6月9日还是9月6日?根据您的机器文化,您将获得不同的结果。如果您的DateTime字符串来自某个地方,那么您可以强制Parse方法使用特定的格式/文化。
回到这个问题,它可能依赖于文化。
答案 2 :(得分:0)
该问题在简化示例中假设第一个变量是DateTime,当它实际上是DateTimeOffset时。消耗的公共方法生成了该变量,并且我错误地认为返回类型仍然是DateTime。
所以他们给出不同结果的原因是因为它们不同!
第一课:即使您知道它们是什么,也要检查类型。 第二课:在SO问题例子中不要过分简化。