datetime.parse сбой марша на испанском языке, каждый второй месяц работает - PullRequest
5 голосов
/ 17 января 2012

У меня странный сбой проверки на сайте ASP.NET MVC 3 с текстовым полем, которое принимает дату и время, выбранные через jqueryui.Сайт настроен для работы только с культурой es-ES и работает большую часть времени, но проверка не проходит каждый раз, когда в этом текстовом поле используется определенный месяц.Метод datetime.parse работает для каждого месяца, кроме марта:

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}

...

каждый месяц работает, кроме марта, марзо по-испански ...

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

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 17 января 2012

Воспроизведение с помощью 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);
}

Попробуйте установить формат, и это работает:

var format = "dd-MMM-yyyy";
var input= "15-mar-2012";
var dt = DateTime.ParseExact(input, format, new CultureInfo("es-ES"));
Console.WriteLine(dt);
1 голос
/ 04 мая 2015

ParseExact справится с задачей, но для этого потребуется рефакторинг большого количества кода. Поскольку проблема вызвана невозможностью различать аббревиатуры Марзо и Мартес. Создайте особую культуру и измените аббревиатуру Martes от Mar до Ma следующим образом:

 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
1 голос
/ 06 марта 2012

У меня такая же проблема с итальянским языком.

Проверено только с версией .NET 4.0 и работой с 2.0.

Сальво.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...