FieldConverter ConverterKind.Date“dd / MM / yyyy”exception

我尝试读取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 { ///  /// different forms for date separator : . or / or space ///  /// the string format of date - first the day ///  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"); } } 

我得到了这个例外:无法从03/11/2008中获取日期参数:来自

我究竟做错了什么?

它失败的原因是/在自定义日期格式字符串中是文化特定的DateSeparator,如MSDN中所述 。

您为IFormatProvider参数指定了null ,因此它使用当前文化,该文化可能具有除/之外的日期分隔符。

最佳解决方案是明确指定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); 

当你尝试时会发生什么:

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

怎么写:

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