在我们的C#DateTime类型中,是什么导致了这种行为?

在我们的C#DateTime类型中,是什么导致了这种行为?,c#,C#,失败: [Test] public void Sadness() { var dateTime = DateTime.UtcNow; Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString()))); } 我想知道ToString()等的幕后发生了什么导致了这种行为 看到Jon的答案后编辑: Expected: 2011-10-31 06:12:44.000 But was: 2011-10-31 0

失败:

[Test]
public void Sadness()
{
   var dateTime = DateTime.UtcNow;
   Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString())));
}
我想知道ToString()等的幕后发生了什么导致了这种行为

看到Jon的答案后编辑:

 Expected: 2011-10-31 06:12:44.000
 But was:  2011-10-31 06:12:44.350
结果:

[Test]
public void NewSadness()
{
    var dateTime = DateTime.UtcNow;
    Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString("o"))));
}

资本和小“o”的结果相同。我正在阅读文档,但仍然不清楚。

看看
dateTime.ToString()
产生了什么-它通常只精确到第二个,尽管这取决于文化背景。如果
ToString()
只给出精确到一秒钟的结果,那么解析字符串无法提供更多信息

您可以使用“o”来提供一个圆形的可折叠字符串表示。例如,此时它会产生如下结果:

Expected: 2011-10-31 12:03:04.161
But was:  2011-10-31 06:33:04.161
编辑:您需要使用相同的说明符进行分析,以获得相同的结果:

2011-10-31T06:28:34.6425574Z

默认的格式说明符是“G”——通用格式,其保真度有限。如果要精确地再现相同的内容,请使用往返说明符“O”


添加
CultureInfo.InvariantCulture
没有帮助:它产生了
预期的:2011-10-31 12:09:51.928,但它是:2011-10-31 06:39:51.928(我编辑了我的问题,加入了你的想法——结果很奇怪,我还是puzzled@Zasz为什么结果会很奇怪?如果你在测试中以错误的方式“预期”和“实际”增加了混淆…这就是我们在这里的意思吗?@Zasz还可以尝试使用
DateTime.Parse(s,null,datetimestyle.RoundtripKind)
@Zasz需要强调的是-确保语法分析知道它需要RoundTripGood调用RoundtripKind是很重要的。我刚刚尝试过它,它是正确往返所必需的。考虑到它以格式化字符串形式出现,这非常奇怪。奇怪。+1.Zasz,请特别阅读Jon链接到的MSDN文章“o”和“u”格式。有详细的解释如何实现往返。谢谢,这是我一直在寻找的。
string text = dateTime.ToString("o");
// Culture is irrelevant when using the "o" specifier
DateTime parsed = DateTime.ParseExact(text, "o", null,
                                      DateTimeStyles.RoundtripKind);
string s = dateTime.ToString("O", CultureInfo.InvariantCulture);
Assert.That(dateTime, Is.EqualTo(DateTime.ParseExact(
       s, "O", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)));