我需要将一些具有此格式的字符串转换为DateTime"MMM yy"。我正在处理"{es es}"文化。
它适用于除March(西班牙语Marzo)外的所有月份。这给了我一个例外:
"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");
这可以很好地工作,例如:
"2013年6月"
"2013年2月"
"Nov-13"
编辑真正的问题在于:
DateTime日期=转换为DateTime("Ene-13");->ok
DateTime日期=转换为DateTime("Feb-13");->ok
DateTime日期=转换为DateTime("Mar-13");->崩溃
DateTime日期=转换为DateTime("Abr-13");->ok
您的日期字符串"Mar-13"
与格式"yyyyMM"
不匹配。您的格式应该是MMM-yy
。
您应该看到:自定义日期和时间格式字符串
以您的格式
"MMM"-月份的缩写名称。
"yy"-年份,从00到99。
编辑:
对于您的问题Convert.ToDateTime("Mar-13");
为什么失败。您需要查看以下代码行:
var currentCulture = new CultureInfo("es-ES");
var monthNames = currentCulture.DateTimeFormat.AbbreviatedMonthNames;
var dayOfWeeks = currentCulture.DateTimeFormat.AbbreviatedDayNames;
如果您观察调试器中的返回值,您将看到对于区域性es-ES
,Month Name和Day Name之间存在匹配,这是在mar
上。
- Marzo/三月为月
- 星期二/星期二为一天
两者都使用相同的缩写,即Mar
。由于Convert.ToDateTime
会尝试为字符串使用可能的格式,因此无法将Mar
识别为月或日名称。这就是为什么你会得到例外。
使用DateTime.ParseExact
并指定一个或多个可能的格式总是一个好主意。
您的格式和值不匹配。试试这个:
string format = "MMM-yy";
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
result = DateTime.ParseExact("Mar-13", format, provider);
编辑
对于es-ES
格式提供程序,我的猜测是Mar
在Marzo(三月)和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
来显式定义格式,而不是让框架尝试推断格式。
参考我对自动DateTime解析背后逻辑的回答:当给定的区域性不知道格式时,Convert.ToDateTime()如何解析给定的字符串
您可以在es-ES
区域性中自动解析Abr-13
,因为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"));
我认为您需要使用正确的CultureInfo并修复格式字符串
CultureInfo provider = new CultureInfo("ES-es");
DateTime result = DateTime.ParseExact("Abr-13", "MMM-yy", provider);
您需要使用与"MMM-yy"格式相关联的西班牙文化信息:
string format = "MMM-yy";
DateTime result;
CultureInfo provider = new CultureInfo("es-ES");
result = DateTime.ParseExact("mar-13", format, provider);
result = DateTime.ParseExact("abr-13", format, provider);
在我的系统上,当前区域性是en-US在尝试转换abril(April)时,以下代码将失败:
string format = "MMM-yy";
DateTime result;
CultureInfo provider = CultureInfo.InvariantCulture;
result = DateTime.ParseExact("abr-13", format, provider);
因此,在我的系统上,我必须创建一种西班牙文化,让代码发挥作用:
string format = "MMM-yy";
DateTime result;
CultureInfo provider = CultureInfo.CreateSpecificCulture("es-ES");
result = DateTime.ParseExact("abr-13", format, provider);
因此,您需要了解代码运行的文化,并采取适当的操作。