2012-01-17 24 views
5

Tengo una falla de validación extraña en un sitio de ASP.NET MVC 3 con un cuadro de texto que acepta un datetime elegido a través de jqueryui. El sitio se ha personalizado para que funcione solo con la cultura es-ES y funciona la mayor parte del tiempo, pero la validación falla cada vez que se usa determinado mes en ese cuadro de texto. El método DateTime.Parse funciona para todos los meses excepto en marcha:datetime.parse falla para marzo en español, cada dos meses funciona

DateTime.Parse("15-feb-2012",CultureInfo.GetCultureInfo("es"), DateTimeStyles.None) 
{15/02/2012 0:00:00} 
    Date: {15/02/2012 0:00:00} 

DateTime.Parse("15-ene-2012",CultureInfo.GetCultureInfo("es"), DateTimeStyles.None) 
{15/01/2012 0:00:00} 
    Date: {15/01/2012 0:00:00} 

DateTime.Parse("15-abr-2012",CultureInfo.GetCultureInfo("es"), DateTimeStyles.None) 
{15/04/2012 0:00:00} 
    Date: {15/04/2012 0:00:00} 

...

cada mes, excepto trabajos de marzo de Marzo en español ...

DateTime.Parse("15-mar-2012",CultureInfo.GetCultureInfo("es"), DateTimeStyles.None) 
DateTime.Parse("15-mar-2012",CultureInfo.GetCultureInfo("es"), DateTimeStyles.None)' threw an exception of type 'System.FormatException' 
    base {System.SystemException}: {"String was not recognized as a valid DateTime."} 

Alguna idea?

+0

Ha comprobado foros y/o documentación en línea para asegurarse de que su específico de la cultura meses abreviatura es correcta? –

+3

Puede que no esté seguro de interpretarlo como "mar" para "marzo" o para "martes"; intente especificar el formato de fecha con ParseExact. – Random832

+0

No tuve ningún problema con esto. Aunque podría estar haciéndolo mal. ¿Se puede reproducir en un entorno de prueba más pequeño (aplicación de consola o algo así) y pegar el método para probarlo? –

Respuesta

5

reproduciendo con NUnit:

[Test] 
[ExpectedException(typeof(FormatException), ExpectedMessage = "String was not recognized as a valid DateTime.")] 
public void ParsingWithAbbreviatedSpanishMarchBlowsUp() 
{ 
    var dt = DateTime.Parse("15-mar-2012", CultureInfo.GetCultureInfo("es-ES"), DateTimeStyles.None); 
} 

intente configurar el formato y esto funciona:

var format = "dd-MMM-yyyy"; 
var input= "15-mar-2012"; 
var dt = DateTime.ParseExact(input, format, new CultureInfo("es-ES")); 
Console.WriteLine(dt); 
+0

ParseExact hizo el truco. Muchas gracias Luke. – dtriana

1

que tienen el mismo problema con el idioma italiano.

Se verificó solo con la versión .NET 4.0 y funciona con 2.0.

Salvo.

1

ParseExact hará el truco pero requiere refactorizar una gran cantidad de código. Dado que el problema es causado por no poder diferenciar las abreviaturas de Marzo y Martes. Crear una cultura específica y modificar Martes abreviatura del Mar a Ma como esto:

Dim ci As CultureInfo = CultureInfo.CreateSpecificCulture("es-US") 
Dim dtfi As DateTimeFormatInfo = ci.DateTimeFormat 
dtfi.AbbreviatedDayNames = {"Dom", "Lun", "Ma", "Mie", "Jue", "Vie", "Sab"} 

CultureInfo.DefaultThreadCurrentCulture = ci 
System.Threading.Thread.CurrentThread.CurrentUICulture = ci 
System.Threading.Thread.CurrentThread.CurrentCulture = ci 
Cuestiones relacionadas