var expected = DateTime.Now;
var value = expected.ToString();
Assert.AreEqual(expected.Ticks, DateTime.Parse(value).Ticks);
Assert.AreEqual失败。预期:其中634590535915492841取代。实际:< 634590535910000000>
为什么会这样?
答案 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”);