在我们的C#DateTime类型中导致此行为的原因是什么?

Zas*_*asz 5 c#

[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'相同的结果.我正在阅读文档,但仍不清楚.

Jon*_*eet 9

看看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)


Mar*_*ell 6

默认格式说明符是"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)