我需要用这种格式将一些字符串转换为DateTime,“MMM”。我正在使用文化"{es-ES}"。
除了三月(西班牙语马佐语)外,整个月都很好。这给我带来了一个例外:
'Convert.ToDateTime("Mar-13")‘抛出了'System.FormatException’System.DateTime {System.FormatException}类型的一个例外。
我试过:
string format = "yyyyMM";
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
result = DateTime.ParseExact("Mar-13", format, provider);这是:
DateTime date = Convert.ToDateTime("Mar-13");这很好,例如:
“六月十三日”
“2月13日”
“11月13日”
..。
编辑真正的问题是:
DateTime date = Convert.ToDateTime("Ene-13");-> ok
DateTime date =Convert.ToDateTime(“2月13日”);-> ok
DateTime date = Convert.ToDateTime("Mar-13");->崩溃
DateTime date = Convert.ToDateTime("Abr-13");-> ok
……
发布于 2014-04-22 13:54:27
日期字符串"Mar-13"与格式"yyyyMM"不匹配。您的格式应该是MMM-yy。
您应该看到:自定义日期和时间格式字符串
以你的格式
"MMM“-这个月的缩写名称。 “耶”-从00岁到99岁。
编辑:
问你为什么Convert.ToDateTime("Mar-13");失败了。您需要查看以下代码行:
var currentCulture = new CultureInfo("es-ES");
var monthNames = currentCulture.DateTimeFormat.AbbreviatedMonthNames;
var dayOfWeeks = currentCulture.DateTimeFormat.AbbreviatedDayNames;如果在调试器中查看返回的值,您将看到区域性es-ES在月名和日名之间以及在mar上有一个匹配。
这两个词都使用相同的缩写,即Mar。由于Convert.ToDateTime会尝试对字符串使用可能的格式,所以它无法将Mar识别为月名或日名。所以你才会有例外。
使用DateTime.ParseExact并指定单个或多种可能格式总是一个好主意。
发布于 2014-04-22 13:54:03
您的格式和值不匹配。试一试:
string format = "MMM-yy";
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
result = DateTime.ParseExact("Mar-13", format, provider);编辑
对于es-ES格式提供程序,我猜Mar在Marzo (3月)和Martes (星期二)之间是不明确的。如果您在适当的格式下使用ParseExact,您应该会很好:
string format = "MMM-yy";
DateTime result;
CultureInfo provider = CultureInfo.GetCultureInfo("es-ES");
// fails
result = DateTime.Parse("Mar-13", provider);
// works
result = DateTime.ParseExact("Mar-13", format, provider);
result = DateTime.ParseExact("Abr-13", format, provider);编辑2
这似乎是一个已知臭虫。他们的解决办法是使用类似的区域性,但是如果您的日期格式是已知的,我建议使用ParseExact显式定义格式,而不是让框架尝试推断格式。
发布于 2014-04-22 14:03:30
引用我关于自动DateTime解析背后的逻辑的答案:当给定区域性不知道格式时,Convert.ToDateTime()如何解析给定的字符串
您可以在Abr-13区域性中自动解析Abr,因为Abr只能匹配为MonthToken。但是在Mar-13 - Mar的情况下,可以匹配为MonthToken,也可以匹配为DayOfWeekToken (星期二),因此DateTime.Parse/Convert.ToDateTime方法被混淆并抛出异常。
如果针对es-ES区域性执行引用答案中的代码,将在输出中看到以下内容:
mar DayOfWeekToken 2
Mar MonthToken 3但是,没有多个匹配的完整月份名称,所以您可以安全地解析'marzo','abril‘值。
由于DateTime.Parse/Convert.ToDateTime方法被Mar值的这种对偶性所混淆,我们需要使用DateTime.ParseExact方法向其提供提示:
DateTime output = DateTime.ParseExact("Mar-13", "MMM-yy", CultureInfo.GetCultureInfo("es-ES"));https://stackoverflow.com/questions/23221561
复制相似问题