2011-10-31 36 views
5
[Test] 
public void Sadness() 
{ 
    var dateTime = DateTime.UtcNow; 
    Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString()))); 
} 

失敗:什麼是導致這種行爲,在我們的C#日期時間類型?

Expected: 2011-10-31 06:12:44.000 
But was: 2011-10-31 06:12:44.350 

,我想知道發生了什麼幕後的ToString()等會導致此行爲。

編輯看到喬恩的答案後:

[Test] 
public void NewSadness() 
{ 
    var dateTime = DateTime.UtcNow; 
    Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString("o")))); 
} 

結果:

Expected: 2011-10-31 12:03:04.161 
But was: 2011-10-31 06:33:04.161 

同樣的結果與大寫和小寫 'O'。我正在閱讀文檔,但仍不清楚。

+0

添加'CultureInfo.InvariantCulture'沒有幫助:它產生'預計:2011-10-31 12:09:51.928 卻被:2011-10-31 06:39:51.928 ' – Zasz

+0

一些解析邏輯/字符串邏輯添加了6小時30分鐘的時間:( – Zasz

回答

6

默認格式說明「G」 - 通用格式 - 保真度有限。如果您想重現,那麼也是同樣的東西,請使用往返說明符「O」。

string s = dateTime.ToString("O", CultureInfo.InvariantCulture); 
Assert.That(dateTime, Is.EqualTo(DateTime.ParseExact(
     s, "O", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind))); 
+0

我編輯了我的問題,納入你的想法 - 結果是w eird,我仍然感到疑惑 – Zasz

+1

@Zasz爲什麼結果很奇怪?如果*在混淆中添加了*,那麼在測試中錯誤地使用了「預期」和「實際」......我們在這裏指的是什麼? –

+1

@Zasz嘗試使用'DateTime.Parse(s,null,DateTimeStyles.RoundtripKind)' –

9

看看dateTime.ToString()的產生 - 它通常只會精確到第二個,儘管它取決於文化背景。如果ToString()只給出精確到秒的結果,則解析字符串無法提供更多信息...

您可以使用「o」standard format string來提供可循環跳轉的字符串表示形式。例如,此刻它產生類似:

2011-10-31T06:28:34.6425574Z 

編輯:您需要使用相同的符解析,以獲得相同的結果回:

string text = dateTime.ToString("o"); 
// Culture is irrelevant when using the "o" specifier 
DateTime parsed = DateTime.ParseExact(text, "o", null, 
             DateTimeStyles.RoundtripKind); 
+0

我編輯了我的答案,我在印度,如果有幫助的話 – Zasz

+1

@Zasz:你需要告訴它*解析*與該說明符。 –

+1

+1。Zasz,請閱讀Jon所鏈接的MSDN文章,特別是「o」和「u」格式,有詳細的解釋如何實現往返。 –

相關問題