92 votes

Problème de DateTime.TryParse avec les dates au format yyyy-dd-MM

J'ai la date suivante au format chaîne "2011-29-01 12:00 am" . J'essaie maintenant de convertir cette date au format datetime avec le code suivant :

DateTime.TryParse(dateTime, out dt); 

Mais j'obtiens toujours la date {1/1/0001 12:00:00 AM}. Pouvez-vous me dire pourquoi ? et comment convertir cette chaîne en date.

EDIT : Je viens de voir que tout le monde a mentionné d'utiliser l'argument du format. Je vais mentionner maintenant que je ne peux pas utiliser le paramètre format car j'ai un paramètre pour sélectionner le format de date personnalisé que l'utilisateur veut, et en fonction de cela l'utilisateur est capable d'obtenir la date dans la zone de texte dans ce format automatiquement via jQuery datepicker.

4 votes

À propos, vous pouvez déterminer si la conversion a échoué en vérifiant la valeur de retour de la fonction TryParse . C'est-à-dire bool success = DateTime.TryParse(...); .

210voto

BrokenGlass Points 91618

Cela devrait fonctionner sur la base de 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);

8 votes

J'ai été plus rapide que vous. Si vous connaissez le format de votre chaîne d'entrée, vous devriez pratiquement toujours utiliser les méthodes TryParseExact/ParseExact.

0 votes

OK, mon format de date est similaire à celui de l'exemple, mais si la valeur du jour ou du mois est à un seul chiffre, l'analyseur DateTime renvoie une erreur, car il cherche deux chiffres alors qu'il n'y en a qu'un. Que suggérez-vous dans ce scénario ?

13 votes

Pour répondre à ma propre question, dans ce cas, si vous utilisez un seul caractère dans le format, cela fonctionne pour les dates à un ou deux caractères. Par exemple, d/m/yyyy fonctionne pour le 13/11/2012.

15voto

ChrisF Points 74295

Vous devez utiliser le ParseExact méthode . Il prend comme second argument une chaîne de caractères qui spécifie le format de la date, par exemple :

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

Si l'utilisateur peut spécifier un format dans l'interface utilisateur, vous devez le traduire en une chaîne de caractères que vous pouvez passer dans cette méthode. Pour ce faire, vous pouvez soit permettre à l'utilisateur d'entrer directement la chaîne de format - bien que cela signifie que la conversion a plus de chances d'échouer car l'utilisateur n'est pas en mesure d'entrer la chaîne de format. sera saisir une chaîne de format non valide - ou avoir une boîte combo qui leur présente les choix possibles et vous configurez les chaînes de format pour ces choix.

S'il est probable que la saisie soit incorrecte (saisie de l'utilisateur par exemple), il est préférable d'utiliser la méthode suivante TryParseExact plutôt que d'utiliser des exceptions pour gérer le cas d'erreur :

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

Une meilleure alternative pourrait être de no présentent à l'utilisateur un choix de formats de date, mais utilisent l'option surcharge qui prend un tableau de formats :

// A list of possible American date formats - swap M and d for European formats
string[] 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" };
string dateString; // The string the date gets read into

try
{
    dateValue = DateTime.ParseExact(dateString, formats, 
                                    new CultureInfo("en-US"), 
                                    DateTimeStyles.None);
    Console.WriteLine("Converted '{0}' to {1}.", dateString, dateValue);
}
catch (FormatException)
{
    Console.WriteLine("Unable to convert '{0}' to a date.", dateString);
}                                               

Si vous lisez les formats possibles à partir d'un fichier de configuration ou d'une base de données, vous pouvez les compléter au fur et à mesure que vous rencontrez les différentes façons dont les gens veulent saisir les dates.

7voto

KateA Points 41

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

DateTime temp;
string   date = "2011-29-01 12:00 am";

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

4voto

RedDeckWins Points 719

De DateTime sur msdn :

Type : System.DateTime% Lorsque cette méthode revient, contient la valeur DateTime équivalente à la date et à l'heure contenues dans s, si la conversion a a réussi, ou Valeur minimale si la conversion a échoué . La conversion de échoue si le paramètre s est nul, est une chaîne vide (""), ou ne contient pas une représentation valide de la date et de l'heure. Ce paramètre est passé sans être initialisé.

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

3voto

Lucas S. Points 175

Ça marche :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X