来自新DateTime()和DateTime.Parse

时间:2015-09-24 08:45:01

标签: 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.CurrentCulture并将新DateTime调用的DateKind设置为Local和UTC,但我得到了相同的结果。

为什么这两种方法不能给出相同的结果?

3 个答案:

答案 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问题例子中不要过分简化。