2015-05-04 21 views
7

範圍工作:DateTime.TryParseExact僅在「單向」

我一直在試圖建立一個super-tolerant DateTime.Parse套路,所以我決定給最「廣泛使用」格式化嘗試更好了解format masks

問題:

我已定義的特定格式(字符串),其餘爲myDate.ToString(format)使用,而且可以創造奇蹟。問題是,如果我得到相同的字符串(結果爲.ToString(format)操作),並將其反饋回DateTime.TryParseExact (...),則會失敗。

代碼/測試:

System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture; 

// Defining Format and Testing it via "DateTime.ToString(format)" 
string format = "MM/dd/yyyy HH:mm:ss tt"; 
string dtNow = DateTime.Now.ToString (format); 
Console.WriteLine (dtNow); 

// Trying to Parse DateTime on the same Format defined Above 
DateTime time; 
if (DateTime.TryParseExact (dtNow, format, provider, System.Globalization.DateTimeStyles.None, out time)) 
{ 
    // If TryParseExact Worked 
    Console.WriteLine ("Result: " + time.ToString()); 
} 
else 
{ 
    // If TryParseExact Failed 
    Console.WriteLine ("Failed to Parse Date"); 
} 

輸出爲:"Failed to Parse Date".

問:

我爲什麼可以使用format字符串格式化某個日期爲文本,但我不能使用相同的format將字符串反饋回日期對象?

編輯:

我已經加入我的方法的一部分this example,我想知道爲什麼「ParseDate」方法未能返回正確的日期,因爲「字符串」是在正確的格式。

+2

什麼是您的'CurrentCulture'? –

+2

嘗試'string dtNow = DateTime.Now.ToString(format,provider);'轉換爲字符串時添加文化。 –

+1

通過'pt-BR'(葡萄牙語(巴西))確認失敗。 –

回答

5

由於您使用DateTime.ToString()方法而沒有任何IFormatProvider,此方法將使用您的CurrentCulture設置。

這就是爲什麼你

string dtNow = DateTime.Now.ToString (format); 

可能產生比MM/dd/yyyy HH:mm:ss tt格式不同的字符串表示。

三件事情可能會導致此問題;

由於您嘗試使用provider(即InvariantCulture)解析您的字符串你的DateTime.TryParseExact方法,也基於該提供者生成你的字符串。

string dtNow = DateTime.Now.ToString(format, provider); 

你告訴你的CurrentCulturept-BR而這種文化具有空字符串""AMDesignatorPMDesignator。這就是爲什麼你的dtNow字符串在它的表示部分上沒有任何AM或PM標誌符。

這裏a demonstration

+0

不應該我的代碼的第一行,解決這個問題嗎? (CultureInfo.InvariantCulture) –

+0

@MarcelloGrechiLins如果你在'DateTime.Now.ToString()'方法中使用它作爲第二個參數,是的,它會修復它。 –

+0

我用另一個例子更新了我的問題。我不明白的是,爲什麼從「字符串」解析時不起作用。這裏沒有日期,沒有任何內容,僅僅是由「TryParseExact」方法指定的正確格式的「字符串」。 –