var expected = DateTime.Now;
var value = expected.ToString();
Assert.AreEqual(expected.Ticks, DateTime.Parse(value).Ticks);
Assert.AreEqual失敗。預計:< 634590535915492841>。實際:< 634590535910000000>。相同日期時間值的比較結果給出'假'
爲什麼會發生這種情況?
var expected = DateTime.Now;
var value = expected.ToString();
Assert.AreEqual(expected.Ticks, DateTime.Parse(value).Ticks);
Assert.AreEqual失敗。預計:< 634590535915492841>。實際:< 634590535910000000>。相同日期時間值的比較結果給出'假'
爲什麼會發生這種情況?
因爲您使用的格式中不包含刻度的默認ToString。
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的信息構建了格式化字符串。
您可以使用The Round-trip ("O", "o") Format Specifier爲了保存包含在日期時間的所有信息:
字符串值= expected.ToString( 「O」);
當你打電話給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");
}
}
}
你停下來想一想,也許它returing'FALSE'因爲他們AREN」相同的'DateTime'值?當你調用'ToString'時,你正在扔掉信息。最後所有的零都告訴你。 – jason
你說得對。對不起 - 週五晚上。 – 1gn1ter