比较相同日期时间值的结果给出“假”

时间:2011-12-09 16:56:17

标签: c#

var expected = DateTime.Now;
var value = expected.ToString();

Assert.AreEqual(expected.Ticks, DateTime.Parse(value).Ticks);

Assert.AreEqual失败。预期:其中634590535915492841取代。实际:< 634590535910000000>

为什么会这样?

4 个答案:

答案 0 :(得分:7)

因为您使用的默认ToString不包含格式的刻度。

答案 1 :(得分:2)

当您像这样调用ToString()时,您将获得当前线程文化的默认格式。如果您想要对值进行往返,则需要使用适当的格式 - 实际上指定的格式为designed specifically for the job

using System;

class Program
{
    static void Main(string[] args)
    {
        DateTime now = DateTime.Now;
        string text = now.ToString("o");
        DateTime parsed;
        if (DateTime.TryParseExact(text, "o", null,
            DateTimeStyles.RoundtripKind, out parsed))
        {
            Console.WriteLine(parsed == now);
        }
        else
        {
            Console.WriteLine("Couldn't parse");
        }
    }
}

答案 2 :(得分:1)

DateTime.Ticks等于100纳秒。鉴于恢复的Ticks值以7个零结尾意味着ToString调用中所有亚秒细节都丢失了。

您需要使用ToString格式,以获得所需的精度。

var expected = DateTime.Now;
var value = expected.ToString("yyyy-MM-dd HH:mm:ss.fffffffzzz");

Assert.AreEqual(expected.Ticks, DateTime.Parse(value).Ticks);

上面代码的重要部分是7 f的集合。这会在小数秒上产生7位数的精度,这正是默认ToString调用中丢失的精度。

我使用this MSDN page on DateTimeFormatInfo中的信息构建了格式字符串。

答案 3 :(得分:0)

您可以使用The Round-trip ("O", "o") Format Specifier来保留DateTime中包含的所有信息:

string value = expected.ToString(“o”);