2017-04-10 54 views
1

我試圖加載datetime和時間字符串過程防止用戶系統設置的時間和日期字符串處理

DateTime strTime = DateTime.ParseExact(strTime.Trim(), "dd/MM/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture); 

我有幾個地方處理日期時間字符串,從dateTimePicker的:

UseDate = dateTimePicker1.Value.ToString("MMMM dd, yyyy - dddd"); 

寫作,然後從文件加載:

dateTimePicker3.Value = DateTime.ParseExact(DB, "yyyy-MM-dd", CultureInfo.InvariantCulture); 

它的工作原理與正確的英語,但不知道如何防止如果用戶有像中國或俄羅斯不同的設置,在這種情況下,我得到:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll 

Additional information: String was not recognized as a valid DateTime. 

我可以防止不同的標點符號的輸入替換"/"".",並且從字符串中刪除所有單詞,但在這種情況下,我我不知道如何找出正確的方法。

例如,在調試中,我看到strTime與俄語"апреля 10, 2017 - понедельник"字符串,但如何將其更改爲正確的可讀日期而無需單詞。我無法用正則表達式處理它,因爲結果我能得到這樣的102017或至少10.20.17但不10 April of 2017必須是10.04.201710/04/201710-04-2017,甚至在不同的順序4/10/2017

+0

也許這可以幫助http://www.karaszi.com/SQLServer/info_datetime.asp#DtFormatsInput – GuidoG

+0

哪裏呢你輸入來自?你可以製作一個只允許一種格式的編輯框,或者它來自外部來源,你無法做任何事情嗎? – GuidoG

+0

@GuidoG你好,問題編輯 – nikorio

回答

1

您使用DateTime.ParseExact,這意味着該格式掩碼您提供應該完全匹配你正在傳遞的字符串以便被轉換爲日期時間。

在該字符串的俄羅斯轉換的情況下(「апреля10 2017 - понедельник」),你應該提供這種類型的面膜用適當的CultureInfo現在

"MMMM dd, yyyy - dddd" 

,如果你有不同的格式解析你可以傳遞,作爲第二個參數ParseExact的字符串格式的數組像這樣的

string[] formats = new string[] 
{ 
    "dd/MM/yyyy hh:mm:ss tt", "MMMM dd, yyyy - dddd" 
}; 

CultureInfo ci = new CultureInfo("ru"); 
DateTime strTime = DateTime.ParseExact(date, formats, ci, DateTimeStyles.None); 
+0

你好,我試圖找到解決方案來改變任何不同的文化輸入到Englesh文化和yyyy-Md – nikorio

+0

但你怎麼知道輸入文化,如果它不是在您的系統區域設置的標準?你有沒有告訴你什麼是輸入字符串的文化? – Steve

+1

但是從你的問題中不清楚的是,如果你有一個特殊的應用程序需要在同一臺PC上處理不同的文化。通常,如果你的winforms應用程序在俄羅斯計算機上運行,​​那麼CultureInfo.CurrentCulture將設置爲俄語,而在意大利它將是意大利語等。一臺計算機使用操作系統的區域設置,除非您有其他需要。 – Steve

2

你不必做任何字符串操作來解析stringDateTime,只是正確的CultureInfo和格式字符串。使用您的示例字符串,順便去解析它會是這樣的:

string strTime = "апреля 10, 2017 - понедельник"; 
CultureInfo ci = new CultureInfo("ru-RU"); 
DateTime dateParsed = DateTime.ParseExact(strTime, "MMMM dd, yyyy - dddd", ci); 

正如你看到的,與此時,相應的文化和格式字符串,日期被正確解析。

BTW,值得注意的是與ParseExact你可以有很多的格式字符串,只要你想,只是用string[]

string[] formats = new string[] 
{ 
    "MMMM dd, yyyy - dddd", "dd/MM/yyyy", "MM-dd-yyyy" 
}; 
DateTime dateParsed = DateTime.ParseExact(strTime, formats, ci); 
+0

,所以他必須知道使用哪種文化信息。如果它在他的意見中混合了呢? – GuidoG

+0

不,你不需要知道它。由於OP使用的是winforms,只要使用'CurrentCulture'就可以讓'ParseExact'工作,只要日期字符串具有適當的格式 – Pikoh

+0

這使得這個答案完成+1 – GuidoG

相關問題