C #: Comment convertir une chaîne en DateTime, où la chaîne peut avoir n’importe quel format de date / heure standard

J’avais posté une question sur la conversion DateTime en chaîne, j’ai eu beaucoup de réponses satisfaisantes pour cela .. donc je remercie beaucoup StackOverflow ..
Voici encore un problème de manipulation des cordes, je suis coincé avec ..

Je dois convertir une chaîne (à partir d’une source externe) en utilisant le code C # .. la chaîne peut avoir le format attendu de DateTime ..

  1. 02/31/2009 01:59:59 format 24 heures
  2. 02/31/2009 01:59:59 AM 12 heures
  3. 2/31/2009 1:59:59
  4. 2/31/2009 1:59:59 AM
  5. 02/01/2009 01:59:59 AM
  6. 2/1/2009 1:59:59
  7. etc …….

J’ai essayé d’utiliser DateTime(Convert.ToInt32(ssortingng_date.Subssortingng(6,4)),Int,Int,Int,Int,Int,Int)
c’est-à-dire, en extrayant les valeurs de mois, jour, etc.

Mais ça ne marche pas .. parce que je ne peux pas extraire parfaitement les valeurs avec la sous-chaîne .. car la longueur de la chaîne varie
J’ai aussi essayé d’extraire les valeurs faisant référence à l’occurrence de “/”, ” espace ” et “:” mais il devient un goulot d’étranglement à dériver avec (non) occurrence de AM / PM

Seules les durées de jour, de mois et d’heures peuvent varier.

Vous pouvez utiliser la surcharge DateTime.ParseExact qui prend une liste de formats:

 private static ssortingng[] formats = new ssortingng[] { "MM/dd/yyyy HH:mm:ss tt", "MM/dd/yyyy HH:mm:ss", "M/dd/yyyy H:mm:ss tt", "M/dd/yyyy H:mm:ss" }; private static DateTime ParseDate(ssortingng input) { return DateTime.ParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None); } 

Cela FormatException une FormatException si la chaîne transmise ne correspond à aucun des formats donnés. Notez que les formats qui attendent AM / PM doivent apparaître avant des formats identiques sans AM / PM ( "MM/dd/yyyy HH:mm:ss tt" vient avant "MM/dd/yyyy HH:mm:ss" ).

Mettre à jour
Comme Henk l’a souligné dans les commentaires, la même fonctionnalité est disponible lors de l’utilisation de TryParseExact qui supprime la situation d’exception. En outre, associé à des types nullables, cela peut être un peu plus propre:

 private static DateTime? ParseDate(ssortingng input) { DateTime result; if (DateTime.TryParseExact(input, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) { return result; } return null; } 

Maintenant, il retournera simplement une référence null s’il ne parvient pas à parsingr l’entrée.

Jetez un coup d’œil à la méthode TryParseExact . Voici un exemple avec le premier cas:

 DateTime date; // I changed 02/31/2009 to 01/31/2009 because the first is not a valid date if (DateTime.TryParseExact("01/31/2009 01:59:59", "MM/dd/yyyy HH:mm:ss", null, DateTimeStyles.None, out date)) { // ssortingng successfully parsed => do something with the date } 

Vous pouvez ensuite conserver une liste de formats différents et essayer d’parsingr la chaîne avec chacun d’eux jusqu’à votre réussite.

Voici tous les formats possibles ..

  1. MM / JJ / AAAA 22/08/2006
  2. jjjj, jj MMMM aaaa Mardi 22 août 2006
  3. jjjj, jj MMMM aaaa HH: mm Mardi, 22 août 2006 à 06h30
  4. jjjj, jj MMMM aaaa hh: mardi, 22 août 2006 06:30
  5. jjjj, jj MMMM aaaa H: mm Mardi, 22 août 2006 6h30
  6. jjjj, jj MMMM aaaa h: mm tt Mardi, 22 août 2006 06h30
  7. jjjj, jj MMMM aaaa HH: mm: ss mardi, 22 août 2006 06:30:07
  8. MM / JJ / AAAA HH: mm 08/22/2006 06:30
  9. MM / JJ / AAAA hh: mm tt 22/08/2006 06:30 AM
  10. MM / JJ / AAAA H: mm 22/08/2006 6:30
  11. MM / jj / aaaa HH: mm: ss 22/08/2006 06:30:07
  12. MMMM dd 22 août
  13. yyyy ‘-‘ MM ‘-‘ dd’T’HH ‘:’ mm ‘:’ ss.fffffffK 2006-08-22T06: 30: 07.7199222-04: 00
  14. jj, jj MMM aaaa HH ‘:’ mm ‘:’ ss ‘GMT’ mar, 22 août 2006 06:30:07 GMT
  15. yyyy ‘-‘ MM ‘-‘ dd’T’HH ‘:’ mm ‘:’ ss 2006-08-22T06: 30: 07
  16. HH: mm 06:30
  17. hh: mm tt 06h30
  18. H: mm 6:30
  19. h: mm tt 6h30
  20. HH: mm: ss 06:30:07
  21. aaaa ‘-‘ MM ‘-‘ jj HH ‘:’ mm ‘:’ ss’Z ‘2006-08-22 06: 30: 07Z
  22. jjjj, jj MMMM aaaa HH: mm: ss mardi, 22 août 2006 06:30:07
  23. aaaa MMMM 2006 Août

DateTime dt1 = DateTime.ParseExact (“2007/01/01 04:23:12”, “aaaa / MM / jj hh: mm: ss”, System.Globalization.CultureInfo.CurrentCulture);

DateTime dt = Convert.ToDateTime (“2007/01/01 04:23:12”, System.Globalization.CultureInfo.CurrentCulture);

Paramètre de format System.Globalization.CultureInfo.CurrentCulture