我想解析日期可能有不同格式的字符串,如:
“21.12.12”,“4,12,2011”,“6月30日”,“2013年4月16日”,“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");
}
}
我对这样的日期有疑问:
“21.12.12” 的解析类似于 “2012年12月21日” ,并且可以< / p>
“4,12,2011” 的解析类似于 “2011年4月12日” ,它不是好的,我需要“2011年12月4日”
如何设置日和月的订单?
必须 前一天 。
答案 0 :(得分:3)
要指定要传递的字符串的格式,您应该使用ParseExact方法。
答案 1 :(得分:2)
使用DateTime.ParseExact
,它还有一个过载允许为所有允许的格式传递string[[]
。
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());
}
我使用了德国文化,因为你的日期字符串包含德国月份名称。所以即使当前的文化不同,这段代码也能正常运作。
答案 2 :(得分:2)
您提供的所有测试日期实际上都在您指定的de-DE
文化中正确解析。问题在于,您首先尝试使用mm.dd.yyyy
样式格式在美国文化中解析它。
一般来说,正确的解决方案是在解析字符串而不是猜测时始终确保您知道正在使用的文化。如果你不得不猜你有时会遇到这些问题。
在这种情况下,虽然看起来它们都是可接受的de-DE
日期字符串,所以你可以解析它们而不需要尝试不同文化的循环(如上所述可能永远不会是完美的结果) )。
答案 3 :(得分: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日
答案 4 :(得分:0)
这是针对en-US
文化的。对我们这些欧洲人来说可能很奇怪,但是美国人真的在一天又一天地写下日期。您可以使用en-GB
代替它 - 它将处理相同的月份名称和欧洲订单。