FieldConverter ConverterKind.Date исключение "дд / мм / гггг" - PullRequest
5 голосов
/ 16 ноября 2010

Я пытаюсь прочитать CSV-файл. моя пятая запись содержит дату: 11.11.2008

Это часть моего кода:

    [FieldConverter(ConverterKind.Date, "dd/MM/yyyy")]
    public DateTime datum_5;

Мой код падает на этом:

Result[] results= (Result[])engine.ReadFile(@"..\Data\expo.txt");

И с этим исключением: Строка: 1. Колонка: 41. Поле: datum_5. Ошибка преобразования '03 / 11/2008 'в тип:' DateTime '. Используя формат: «дд / мм / гггг»

Когда я делаю это:

[FieldConverter(typeof(ConvertDate))]

        public DateTime datum_5;

с этим:

internal class ConvertDate : ConverterBase
   {

       /// <summary>
       /// different forms for date separator : . or / or space
       /// </summary>
       /// <param name="from">the string format of date - first the day</param>
       /// <returns></returns>

       public override object StringToField(string from)
       {
           DateTime dt;

           if (DateTime.TryParseExact(from, "dd.MM.yyyy", null, DateTimeStyles.None, out dt))
               return dt;

           if (DateTime.TryParseExact(from, "dd/MM/yyyy", null, DateTimeStyles.None, out dt))
               return dt;

           if (DateTime.TryParseExact(from, "dd MM yyyy", null, DateTimeStyles.None, out dt))
               return dt;

           throw new ArgumentException("can not make a date from " + from, "from");

       }
   }

Я получил это исключение: не могу сделать дату от 11.03.2008 Параметернаам: от

Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 16 ноября 2010

Причиной сбоя является то, что / в пользовательской строке формата даты имеет значение специфический для культуры DateSeparator, как описано в MSDN .

Вы указываете null для аргумента IFormatProvider, поэтому он использует текущую культуру, которая предположительно имеет разделитель даты, отличный от /.

Лучшее решение - явно указать CultureInfo.InvariantCulture (вторая версия ниже). Экранирование '/' в вашей пользовательской строке формата даты так, что оно будет обрабатываться как буквенная косая черта, а не как DateSeparator (первая версия ниже).

// Set current culture to a culture that uses "." as DateSeparator
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
// This will work - escaping means it uses a literal / as the separator
DateTime.TryParseExact(s, @"dd\/MM\/yyyy", null, DateTimeStyles.None, out result);

// This is better - Culture.InvariantCulture uses / for the DateTimeFormatInfo.DateSeparator
// and you clearly express the intent to use the invariant culture
DateTime.TryParseExact(s, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out result);

// This will fail - / means use DateTimeFormatInfo.DateSeparator which is "." in the de-DE culture
DateTime.TryParseExact(s, "dd/MM/yyyy", null, DateTimeStyles.None, out result);
2 голосов
/ 16 ноября 2010

Что происходит при попытке:

DateTime.TryParseExact(from, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
0 голосов
/ 16 января 2014

Что если написать:

[FieldConverter(ConverterKind.Date, "dd'/'MM'/'yyyy")]
public DateTime datum_5;
...