2010-11-16 19 views
5

Bir csv dosyası okumayı deniyorum. Bu konudaFieldConverter ConverterKind.Date "dd/AA/yyyy" istisnası

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

Kodum crashs:

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

Ve bu istisna ile bu benim kod parçasıdır 03/11/2008

: benim beşinci rekor bir tarih contans: Satır: 1. Sütun: 41. Alan: datum_5. '03/11/2008 'dönüştürerek hata:' DateTime '. formatını kullanma: bununla

[FieldConverter(typeof(ConvertDate))] 

     public DateTime datum_5; 

: 'gg/aa/yyyy'

i Bunu yaparken

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

     } 
    } 

bu özel durum var: 03 bir tarih yapamaz/11/2008 Parametre::

Neyi yanlış yapıyorum? Eğer denemek ne olur

cevap

5

o da çöküyor neden özel bir tarih formatı dizesinde a culture-specific DateSeparator as described in MSDN olduğunu/olmasıdır.

IFormatProvider bağımsız değişkeni için null belirtiyorsunuz, bu yüzden/dışında bir tarih ayırıcısı olan geçerli kültürü kullanıyorsunuz.

En iyi çözüm, CultureInfo.InvariantCulture'ı (aşağıdaki ikinci sürüm) açıkça belirtmektir. Özel tarih biçimi dizenizdeki '/' ifadesini kullanarak, bir DateSeparator öğesinin çalışması yerine (ilk sürümün altında) bir harf hatası olarak ele alınması gerekir.

// 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

sayesinde, şimdi çalışıyor – meersmans

2

:

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

Ne yazma eğer:

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