56 votes

Pourquoi DateTime.ParseExact() ne peut-il pas analyser "9/1/2009" en utilisant "M/d/yyyy" ?

J'ai une chaîne de caractères qui ressemble à ceci : "9/1/2009". Je veux la convertir en un objet DateTime (en utilisant C#).

Ça marche :

DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

Mais je ne comprends pas pourquoi cela ne fonctionne pas :

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

Il n'y a pas de mot dans la date (comme "septembre"), et je connais le format spécifique, donc je préférerais utiliser ParseExact (et je ne vois pas pourquoi CultureInfo serait nécessaire). Mais je continue à obtenir l'exception redoutée "String was not recognized as a valid DateTime".

Merci

Un petit suivi. Voici 3 approches qui fonctionnent :

DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture);
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));

Et en voici 3 qui ne fonctionnent pas :

DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture);
DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"));
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);

Ainsi, Parse() fonctionne avec "en-US", mais pas ParseExact... Inattendu ?

91voto

Jon Skeet Points 692016

Je pense que le problème vient des barres obliques dans la chaîne de format par rapport à celles des données. C'est un caractère séparateur de date sensible à la culture dans la chaîne de format, et l'argument final étant null signifie "utiliser la culture actuelle". Si vous soit échapper aux barres obliques ("M'/'d'/'yyyy") ou vous spécifiez CultureInfo.InvariantCulture ça va aller.

Si quelqu'un est intéressé à reproduire ceci :

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", 
                                  new CultureInfo("de-DE"));

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  new CultureInfo("en-US"));

// Works
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  CultureInfo.InvariantCulture);

// Fails
DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", 
                                  new CultureInfo("de-DE"));

3voto

Lee Points 6659

Je parie que la culture de votre machine n'est pas "en-US". De la documentation :

Si fournisseur est une référence nulle (Nothing en Visual Basic), la culture actuelle est utilisée.

Si votre culture actuelle n'est pas "en-US", cela expliquerait pourquoi cela fonctionne pour moi mais pas pour vous. et fonctionne lorsque vous spécifiez explicitement que la culture est "en-US".

2voto

Scott Points 3238

Essayez

Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))

0voto

RRUZ Points 98685

Essayez ceci

provider = new CultureInfo("en-US");
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);

Au revoir.

-1voto

BigOldSofty Points 11

J'ai essayé sur XP et ça ne fonctionne pas si le PC est réglé sur l'heure internationale yyyy-M-d. Placez un point d'arrêt sur la ligne et avant qu'elle ne soit traitée, changez la chaîne de date pour utiliser '-' à la place de '/' et vous verrez que cela fonctionne. Cela ne fait aucune différence que vous ayez l'InfoCulture ou non. Il semble étrange de pouvoir spécifier un format expérimenté et de voir le séparateur ignoré.

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