Problème DateTime.TryParse avec les dates du format aaaa-jj-MM

J’ai la date suivante en format de chaîne “2011-29-01 12:00 am”. J’essaie maintenant de convertir ce format au format datetime avec le code suivant:

DateTime.TryParse(dateTime, out dt); 

Mais je suis toujours dt comme {1/1/0001 12:00:00}, pouvez-vous s’il vous plaît me dire pourquoi? et comment puis-je convertir cette chaîne à ce jour.

EDIT: Je viens de voir tout le monde mentionné pour utiliser l’argument de format. Je mentionnerai maintenant que je ne peux pas utiliser le paramètre de format car j’ai un paramètre pour sélectionner le format de date personnalisé que l’utilisateur souhaite et, en fonction de cet utilisateur, il peut obtenir automatiquement la date dans ce format via jQuery datepicker.

Cela devrait fonctionner selon votre exemple “2011-29-01 12:00 am”

 DateTime dt; DateTime.TryParseExact(dateTime, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt); 

Vous devez utiliser la méthode ParseExact . Cela prend une chaîne comme deuxième argument qui spécifie le format dans lequel se trouve la date, par exemple:

 // Parse date and time with custom specifier. dateSsortingng = "2011-29-01 12:00 am"; format = "yyyy-dd-MM h:mm tt"; try { result = DateTime.ParseExact(dateSsortingng, format, provider); Console.WriteLine("{0} converts to {1}.", dateSsortingng, result.ToSsortingng()); } catch (FormatException) { Console.WriteLine("{0} is not in the correct format.", dateSsortingng); } 

Si l’utilisateur peut spécifier un format dans l’interface utilisateur, vous devez le traduire en une chaîne que vous pouvez transmettre à cette méthode. Vous pouvez le faire soit en permettant à l’utilisateur d’entrer directement la chaîne de format – bien que cela signifie que la conversion est plus susceptible d’échouer car ils entreront une chaîne de format invalide – ou avec une liste déroulante qui leur présentera les choix possibles et vous configurer les chaînes de format pour ces choix.

S’il est probable que l’entrée soit incorrecte (entrée utilisateur par exemple), il serait préférable d’utiliser TryParseExact plutôt que des exceptions pour gérer le cas d’erreur:

 // Parse date and time with custom specifier. dateSsortingng = "2011-29-01 12:00 am"; format = "yyyy-dd-MM h:mm tt"; DateTime result; if (DateTime.TryParseExact(dateSsortingng, format, provider, DateTimeStyles.None, out result)) { Console.WriteLine("{0} converts to {1}.", dateSsortingng, result.ToSsortingng()); } else { Console.WriteLine("{0} is not in the correct format.", dateSsortingng); } 

Une meilleure alternative pourrait être de ne pas présenter à l’utilisateur un choix de formats de date, mais d’utiliser la surcharge qui prend un éventail de formats :

 // A list of possible American date formats - swap M and d for European formats ssortingng[] formats= {"M/d/yyyy h:mm:ss tt", "M/d/yyyy h:mm tt", "MM/dd/yyyy hh:mm:ss", "M/d/yyyy h:mm:ss", "M/d/yyyy hh:mm tt", "M/d/yyyy hh tt", "M/d/yyyy h:mm", "M/d/yyyy h:mm", "MM/dd/yyyy hh:mm", "M/dd/yyyy hh:mm", "MM/d/yyyy HH:mm:ss.ffffff" }; ssortingng dateSsortingng; // The ssortingng the date gets read into try { dateValue = DateTime.ParseExact(dateSsortingng, formats, new CultureInfo("en-US"), DateTimeStyles.None); Console.WriteLine("Converted '{0}' to {1}.", dateSsortingng, dateValue); } catch (FormatException) { Console.WriteLine("Unable to convert '{0}' to a date.", dateSsortingng); } 

Si vous lisez les formats possibles à partir d’un fichier de configuration ou d’une firebase database, vous pouvez les append lorsque vous rencontrez les différentes manières de saisir des dates.

De DateTime sur msdn:

Type: System.DateTime% Lorsque cette méthode retourne, contient la valeur DateTime équivalente à la date et l’heure contenues dans s, si la conversion a réussi ou MinValue si la conversion a échoué . La conversion échoue si le paramètre s est nul, est une chaîne vide (“”) ou ne contient pas de représentation sous forme de chaîne valide d’une date et d’une heure. Ce paramètre est transmis non initialisé.

Utilisez parseexact avec la chaîne de format "yyyy-dd-MM hh:mm tt" place.

Ça marche:

 DateTime dt = DateTime.ParseExact("2011-29-01 12:00 am", "yyyy-dd-MM hh:mm tt", System.Globalization.CultureInfo.InvariantCulture); 

Essayez d’utiliser la méthode TryParseExact sûre

 DateTime temp; ssortingng date = "2011-29-01 12:00 am"; DateTime.TryParseExact(date, "yyyy-dd-MM hh:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None, out temp); 
 DateTime dt = DateTime.ParseExact("11-22-2012 12:00 am", "MM-dd-yyyy hh:mm tt", System.Globalization.CultureInfo.InvariantCulture); 

Si vous donnez à l’utilisateur la possibilité de modifier le format de date / heure, vous devrez créer une chaîne de format correspondante à utiliser pour l’parsing. Si vous connaissez les formats de date possibles (c.-à-d. Que l’utilisateur doit sélectionner dans une liste), cela est beaucoup plus facile car vous pouvez créer ces chaînes de format au moment de la compilation.

Si vous laissez l’utilisateur créer un format de format date / heure en format libre, vous devrez créer les chaînes de format DateTime correspondantes à l’exécution.