2010-11-16 35 views
5

J'essaie de lire un fichier csv. mon cinquième disque Contans une date: 03/11/2008FieldConverter ConverterKind.Date "jj/MM/aaaa" exception

Ceci est un morceau de mon code:

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

Mon code heurtes à ce sujet:

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

Et à cette exception: Ligne: 1. Colonne: 41. Champ: donnée_5. Erreur lors de la conversion de '03/11/2008 'en type:' DateTime '. En utilisant le format: 'dd/MM/yyyy'

Quand je fais ceci:

[FieldConverter(typeof(ConvertDate))] 

     public DateTime datum_5; 

avec ceci:

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

     } 
    } 

J'ai eu cette exception: ne peut pas faire une date à partir de 03/Paramètre: de

Qu'est-ce que je fais mal?

Répondre

5

La raison pour laquelle il est défaut est que/dans une chaîne de format de date personnalisé est a culture-specific DateSeparator as described in MSDN.

Vous spécifiez null pour l'argument IFormatProvider, donc il utilise la culture actuelle, qui a probablement un séparateur de date autre que /.

La meilleure solution est de spécifier explicitement CultureInfo.InvariantCulture (deuxième version ci-dessous). Échapper le '/' dans votre chaîne de format de date personnalisée afin qu'il soit traité comme une barre oblique plutôt que comme un DateSeparator fonctionnera également (première version ci-dessous).

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

Merci, il travaille maintenant – meersmans

2

Qu'est-ce qui se passe lorsque vous essayez:

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

si écrire:

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