在我们的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)));