2013-10-21 82 views
0

我在將2個字符串解析爲DateTime時注意到這種奇怪的行爲。 第一個字符串(造成的異常)「20/10/2013上午03時08分30秒」 第二串(無例外正確換算)「2013年9月10日上午03點09分37秒」奇怪的日期時間解析行爲

的用來轉換代碼是:

string date_1 = "20/10/2013 3:08:30 AM"; 
string date_2 = "9/10/2013 3:09:37 AM"; 
try 
{ 
DateTime d1 = DateTime.parse(date_1, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); //throws exception (String was not recognized as a valid DateTime) 
} catch (Exception ex) { throw ex; } 
DateTime d2 = DateTime.parse(date_2, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); 

可有人請解釋爲什麼較完整的日期格式相同兩個字符串做到這一點?

謝謝大家提前。

+4

沒有20個月...使用正確的文化來解析或修正「ParseExact」的格式。 –

+0

聽起來像是mm/dd/yyyy與dd/mm/yyyy的錯誤......你是否在解析後檢查了d2中的月份和日期字段?他們是你所期望的,即日= 9月= 10月? –

+0

CultureInfo.InvariantCulture的默認日期格式是什麼? 是MM/dd/yyyy hh:mm:ss tt或dd/MM/yyyy hh:mm:ss tt? – Rafael

回答

2

這將引發由於美國最新符號預計每月第一場:

string d = "20/10/2013 3:08:00 AM"; 
Console.WriteLine(DateTime.Parse(d, new CultureInfo("en-US"))); 

同爲InvariantCulture的。

這將工作:

DateTime.Parse(d, new CultureInfo("nl-NL")) 
+0

InvariantCulture與「en-US」相同嗎?什麼是「NL-NL」? – Rafael

+1

nl-NL強制荷蘭語區域設置將此特定字符串解析爲DateTime。 '不變文化的自定義格式字符串是「MM/dd/yyyy」,如下所示:http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.80%29.aspx –

+0

nl-NL只是一個例子,顯示它在荷蘭的工作情況,當天是第一個月的第一場 – Laurijssen

0

您解析日期時,需要指定文化。如果您的計算機位置設置對於您的地區是正確的,那麼日期也是如此,那麼您可以簡單地解析當前的文化。

E.g.

string date = "20/10/2013 3:08:00 AM";  
Console.WriteLine(DateTime.Parse(date, CultureInfo.CurrentUICulture)); 

或者乾脆:

string date = "20/10/2013 3:08:00 AM";  
Console.WriteLine(DateTime.Parse(date)); 

這將在澳大利亞,我在這裏工作,但是如果您的區域設置爲美國爲例,那麼你就需要指定您所期望的日期到文化被格式化。例如

string date = "20/10/2013 3:08:00 AM";  
Console.WriteLine(DateTime.Parse(date, new CurrentUICulture("en-AU")); //en-GB, etc 

話雖這麼說,這是更快(也許更安全),如果你期望的日期格式是不正確的使用DateTime.TryParse

+0

我知道,但我想要一個約會適用於所有文化,這就是爲什麼我使用CultureInfo.InvariantCulture。 – Rafael

+0

您必須知道日期格式才能解析它。例如1/10/12意味着不同的東西,這取決於它進入哪種文化。最好的選擇是將文化與日期一起存儲或以通用格式存儲,如yyyy-MM-dd – codemonkeh

+0

是的謝謝,我是已經使用DateTime.UTCNow來獲取日期。 – Rafael