2013-06-29 46 views
1

我想分析与日期字符串,可以有不同的格式,如:C#:字符串转换为DateTime

“12年12月21日”, “4,12,2011”, “11年6月30日”,“16 12 2013年“,”2013年4月“,”2012年4月12日“,”12,März2011“。

我有这样的代码:

string[] ll = {"en-US", "de-DE"}; 
date = "4,12,2011"; 
foreach (string l in ll) { 
    if (DateTime.TryParse(date, new CultureInfo(l), 
          DateTimeStyles.None, out pDate)) { 
     return pDate;//.ToString("dd.MM.yyyy"); 
    } 
} 

而且我有这样的日期问题:

“12年12月21日”解析像“2012年12月21”,它是好的

“4,12,2011”解析像“2011 4月12日”,这也不行,我需要

如何为天定为了 “2011年12月4”和月?

它必须是月前天。

+1

4,12,2011是4月12日和12月4日的*有效*字符串。除非您指定格式,否则代码无法知道其中的含义。 –

+1

我发誓,这是多次要求soooooo。这是一个重复的定义。 –

回答

0

这是专门针对en-US文化。对我们欧洲人来说可能很奇怪,但美国人确实在日月前写了一个月。您可以改用en-GB - 它将处理与月份和欧洲订单相同的名称。

3

要指定您传递的字符串的格式,您应该使用ParseExact方法。

+0

但是,如果你不知道确切的格式是什么,除非你可以建议能够轻松地解析“21.12.12”和“2012年4月12日”的代码,否则这并没有帮助......文化是去... – Chris

+1

重载之一可以让你指定多种格式。 –

+0

关键是为什么麻烦使用精确解析和指定很多不同的格式,而不是仅仅使用解析,并让它尝试所有可以想到的格式,如果这种方式一旦解决了文化问题就可以工作...... – Chris

1

根据你的代码

string[] ll = {"en-US", "de-DE"}; 

您最初尝试用 “EN-US” 文化解析日期时间;因此, “4,12,2011” 将被解析 美国人做 - MM/DD/YYYY - 月第(4月12日)。您的阵列

string[] ll = {"de-DE", "en-US"}; 

和“4,12,2011”中更改顺序将在12月

2

使用DateTime.ParseExact,它也过载THA允许通过对所有允许的格式string[[] 4。

string[] dates = new[] { "21.12.12", "4,12,2011", "30 Jun 11", "16 12 2013", "April 2013", "12. April 2012", "12, März 2011" }; 
CultureInfo germanCulture = CultureInfo.CreateSpecificCulture("de-DE"); // you are using german culture 
string[] formats = new[] { "dd/MM/yy", "d,MM,yyyy", "dd MMM yy", "dd MM yyyy", "MMMM yyyy", "dd. MMMM yyyy", "dd, MMMM yyyy"}; 

foreach (string dateString in dates) 
{ 
    DateTime dt = DateTime.ParseExact(dateString, formats, germanCulture, DateTimeStyles.None); 
    Console.WriteLine(dt.ToString()); 
} 

我已经使用德国文化,因为您的日期字符串包含德国月份名称。所以即使当前的文化不同,这个代码也能正常工作。

+0

如果你有正确的文化,你不需要精确解析。通过使用'Parse'和'de-DE'文化,所有这些字符串都可以工作,而无需通过格式来覆盖每一种可能性。 – Chris

2

所有的测试日期,你给实际在您指定的de-DE文化正确解析的。问题在于,您首先在使用mm.dd.yyyy样式格式的美国文化中试图解析它。

一般而言,正确的解决方案是始终确保在分析字符串时知道您使用的文化,而不是猜测。如果你必须猜测你有时会遇到这类问题。

在这种情况下,尽管它们看起来都是可接受的de-DE日期字符串,因此您可以将它们解析为不需要尝试不同文化的循环(如上所述可能永远不会是完美的结果)。

+0

+1为“所有日期解析正确”,我没有测试,即使我的文化是“德德”;) –

+0

@TimSchmelter:我测试很大程度上是因为我很好奇为什么en-us在那里第一个地方。这显然是问题的原因,所以我试图找出解决其他问题的方法。然后我发现它没有其他问题。 :) – Chris