2015-09-28 3 views
2

J'ai besoin d'analyser les datetimeoffsets à partir de chaînes de formats multiples. L'une des chaînes qui échouent: 08/12/1992 07.00.00 -05: 00Analyse d'une chaîne DateTimeOffset en C#

Maintenant, lorsque je tente d'analyser, je l'utilise:

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", "dd/MM/yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture) 

Ce qui donne un FormatException:

"La chaîne n'a pas été reconnue comme un DateTime valide."

Je peux aussi ajouter délimiteurs dans les séparateurs:

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", "dd'/'MM'/'yyyy HH':'mm':'ss zzz", CultureInfo.InvariantCulture) 

... ou d'autres permutations de petite/lettre majuscule ou séparateurs, mais je reçois la même erreur.

Quelqu'un peut-il me dire pourquoi les lignes ParseExact ci-dessus ne fonctionnent pas, et comment les corriger?

EDIT: J'ai essayé d'utiliser une requête LINQ pour remplacer les deux points par des points (: ->.). Apparemment, cela n'a pas fonctionné correctement - merci pour les réponses.

+0

Cela ne ressemble pas à une chaîne de date et d'heure de culture invariante. – juharr

Répondre

5

Votre chaîne date réelle (en fait de temps) délimite les heures des minutes des secondes avec un point ., de sorte que votre format doit faire la même chose:

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", 
    "dd/MM/yyyy HH.mm.ss zzz", CultureInfo.InvariantCulture) 
//    ^^ 
//    | | 

Si vous avez des formats de chaînes multiples dans vos données , vous pouvez faire quelque chose comme ceci:

public static DateTimeOffset Parse(string str) 
    { 
     string[] formats = 
     { 
      "dd/MM/yyyy HH.mm.ss zzz", 
      "dd/MM/yyyy HH:mm:ss zzz" 
      // ... possibly more ... 
     }; 

     var dto = new DateTimeOffset(); 
     if (!formats.Any(f => DateTimeOffset.TryParseExact(str, f, CultureInfo.InvariantCulture, DateTimeStyles.None, out dto))) 
     { 
      throw new ArgumentException("Unrecognized date format"); 
     } 

     return dto; 
    } 
1

Dans la déclaration

DateTimeOffset.ParseExact("08/12/1992 07.00.00 -05:00", 
          "dd/MM/yyyy HH:mm:ss zzz", 
          CultureInfo.InvariantCulture) 

la chaîne de format utilise : comme séparateur pour les parties de temps, mais l'argument de données utilise . comme séparateur.