2011-12-09 55 views
3
var expected = DateTime.Now; 
var value = expected.ToString(); 

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

Assert.AreEqual失敗。預計:< 634590535915492841>。實際:< 634590535910000000>。相同日期時間值的比較結果給出'假'

爲什麼會發生這種情況?

+0

你停下來想一想,也許它returing'FALSE'因爲他們AREN」相同的'DateTime'值?當你調用'ToString'時,你正在扔掉信息。最後所有的零都告訴你。 – jason

+0

你說得對。對不起 - 週五晚上。 – 1gn1ter

回答

7

因爲您使用的格式中不包含刻度的默認ToString。

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的信息構建了格式化字符串。

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