FieldConverter ConverterKind.Date“dd / MM / yyyy”异常

时间:2010-11-16 15:33:06

标签: c# .net datetime csv filehelpers

我尝试读取csv文件。 我的第五个记录是一个日期:03/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'。使用格式:'dd / MM / yyyy'

当我这样做时:

[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");

       }
   }

我遇到了这个例外:无法从2008年11月3日开始约会 Parameternaam:来自

我做错了什么?

3 个答案:

答案 0 :(得分:5)

失败的原因是/在自定义日期格式字符串中为a culture-specific DateSeparator as described in 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);

答案 1 :(得分:2)

尝试时会发生什么:

DateTime.TryParseExact(from, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);

答案 2 :(得分:0)

如果写:

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