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

时间:2011-10-31 06:19:30

标签: c#

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

2 个答案:

答案 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)));