特定DateTime异常



我需要将一些具有此格式的字符串转换为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格式提供程序,我的猜测是MarMarzo(三月)和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);

因此,您需要了解代码运行的文化,并采取适当的操作。

相关内容

  • 没有找到相关文章