同一DateTime值的比较结果为'false'

本文关键字:false 结果 DateTime 比较 同一 | 更新日期: 2023-09-27 18:17:26

var expected = DateTime.Now;
var value = expected.ToString();
Assert.AreEqual(expected.Ticks, DateTime.Parse(value).Ticks);

断言。AreEqual失败了。预期:& lt; 634590535915492841>。实际:& lt; 634590535910000000>。

为什么会这样?

同一DateTime值的比较结果为'false'

因为你使用的是默认的ToString,它的格式中不包含刻度。

当您这样调用ToString()时,您将获得当前线程区域性的默认格式。如果要来回传递值,则需要使用适当的格式—确实有专门为该作业指定的格式:

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");
        }
    }
}

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调用所丢失的。

我用DateTimeFormatInfo上MSDN页面的信息构建了格式字符串。

您可以使用The Round-trip ("O", "O")格式说明符来保存DateTime:

中包含的所有信息。

string value = expected.ToString(" 0 ");