2012-01-17 4 views
5

Mam dziwne niepowodzenie sprawdzania poprawności w witrynie ASP.NET MVC 3 z pola tekstowego, który akceptuje datetime wybrana za pośrednictwem jqueryui. Witryna została dostosowana do pracy tylko z kulturą es-ES i działa przez większość czasu, ale walidacja kończy się niepowodzeniem za każdym razem, gdy w tym polu tekstowym używany jest określony miesiąc. Metoda DateTime.Parse działa dla każdego miesiąca, z wyjątkiem marszu:datetime.parse nie udaje się na marzec w języku hiszpańskim, co drugi miesiąc działa

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} 

...

co miesiąc prac z wyjątkiem marca Marzo w hiszpański ...

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."} 

Każdy pomysł?

+0

Czy sprawdziłeś fora i/lub dokumentację online, aby upewnić się, że twój skrót miesiąca specyficzny dla danej kultury jest poprawny? –

+3

Może nie być pewne, czy interpretować go jako "mar" dla "marzo" czy "martes" - spróbuj określić format daty za pomocą programu ParseExact. – Random832

+0

Nie miałem z tym problemu. Być może robię to źle. Czy możesz odtworzyć w mniejszym środowisku testowym (aplikacja konsolowa lub coś podobnego) i wkleić metodę, aby to udowodnić? –

Odpowiedz

5

Odtwarzanie z 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); 
} 

Spróbuj ustawić format i to działa:

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 załatwił sprawę. Wielkie dzięki Luke. – dtriana

1

Mam ten sam problem z języka włoskiego.

Został zweryfikowany tylko z wersją .NET 4.0 i działa z wersją 2.0.

Salwa.

1

ParseExact zrobi lewy, ale wymaga odświeżenia dużej ilości kodu. Ponieważ problem jest spowodowany brakiem możliwości rozróżnienia skrótów Marzo i Martes. Stwórz specyficzną kulturę i modyfikuj skrót Martesa z Mar na Ma w ten sposób:

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 
Powiązane problemy