var expected = DateTime.Now;
var value = expected.ToString();
Assert.AreEqual(expected.Ticks, DateTime.Parse(value).Ticks);
断言。AreEqual失败了。预期:& lt; 634590535915492841>。实际:& lt; 634590535910000000>。
为什么会这样?
因为你使用的是默认的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 ");