1

我想解析具有不同格式的日期字符串,例如:

“21.12.12”、“4,12,2011”、“30 Jun 11”、“16 12 2013”​​、“2013 年 4 月”、“12. April 2012”、“12, März 2011”。

我有这个代码:

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");
   }
}

我对这样的日期有疑问:

"21.12.12"解析为"21 December 2012"

"4,12,2011"被解析为"12 April 2011",不行,我需要 "4 December 2011"

如何设置日和月的顺序?

必须是Day before Month

4

5 回答 5

3

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

于 2013-06-29T18:34:20.457 回答
2

使用DateTime.ParseExact,它还有一个重载 tha 允许string[[]为所有允许的格式传递 a 。

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());
}

我使用了德国文化,因为您的日期字符串包含德国月份名称。因此,即使当前文化不同,此代码也有效。

于 2013-06-29T18:44:56.453 回答
2

您提供的所有测试日期实际上都在de-DE您指定的文化中正确解析。问题在于,您首先尝试在他们使用mm.dd.yyyy样式格式的美国文化中对其进行解析。

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

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

于 2013-06-29T18:49:52.393 回答
1

根据你的代码

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

您最初尝试使用“en-US”文化解析 DateTime;所以“4,12,2011”将像美国人一样被解析 - MM/DD/YYYY - 第一个月(4 月 12 日)。更改阵列中的顺序

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

“4,12,2011”将是 12 月 4 日

于 2013-06-29T18:41:21.820 回答
0

这是特定于en-US文化的。对我们欧洲人来说,这可能很奇怪,但美国人确实在日期中逐月写字。您可以en-GB改用 - 它将处理相同的月份名称和欧洲订单。

于 2013-06-29T18:38:14.570 回答