[Test]
public void Sadness()
{
var dateTime = DateTime.UtcNow;
Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString())));
}
失败:
Expected: 2011-10-31 06:12:44.000
But was: 2011-10-31 06:12:44.350
我希望知道ToString()等幕后发生的事情会导致此行为。
编辑看完Jon的答案后:
[Test]
public void NewSadness()
{
var dateTime = DateTime.UtcNow;
Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString("o"))));
}
结果:
Expected: 2011-10-31 12:03:04.161
But was: 2011-10-31 06:33:04.161
与资本和小'o'相同的结果。我正在阅读文档,但仍不清楚。
答案 0 :(得分:9)
看看dateTime.ToString()
生成的内容 - 它通常只对第二种内容有效,尽管它取决于文化背景。如果ToString()
只给出精确到秒的结果,则解析字符串无法提供更多信息...
您可以使用“o”standard format string来提供可循环访问的字符串表示形式。例如,目前它产生类似的东西:
2011-10-31T06:28:34.6425574Z
编辑:您需要使用相同的说明符进行解析才能获得相同的结果:
string text = dateTime.ToString("o");
// Culture is irrelevant when using the "o" specifier
DateTime parsed = DateTime.ParseExact(text, "o", null,
DateTimeStyles.RoundtripKind);
答案 1 :(得分:6)
默认格式说明符是“G” - 通用格式 - 具有有限的保真度。如果要重现完全相同的事情,请使用往返说明符“O”。
string s = dateTime.ToString("O", CultureInfo.InvariantCulture);
Assert.That(dateTime, Is.EqualTo(DateTime.ParseExact(
s, "O", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind)));