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