2010-11-16 56 views
5

我尝试读取csv文件。 我的第五个记录contans日期:2008年3月11日FieldConverter ConverterKind.Date“dd/MM/yyyy”异常

这一块我的代码:这个

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

我的代码crashs:

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

     } 
    } 

我得到这个异常:无法从03做出日期/ 11/2008 Parameternaam:从

我在做什么错?

回答

5

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

感谢,现在的工作 – meersmans 2010-11-16 18:31:05

2

当您尝试,会发生什么:

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

如果写的是什么:

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