2009-08-25 9 views
3

Je rencontre des difficultés lors de l'analyse des chaînes de DateTime à l'aide de DateTime.ParseExact. Data est une variable chaîne chargée avec des dates au format "20/05/2009". J'ai essayé de virer de bord pendant un faux temps juste pour voir si ça marcherait, et ce n'est pas le cas (avec ou sans l'amure). J'ai également essayé d'utiliser le spécificateur de format "g" et cela n'a pas fonctionné, j'ai toujours l'exception que ce n'est pas une chaîne DateTime valide. Les seules dates pour lesquelles cela fonctionne sont comme "12/20/2009" (notez que 2 chiffres dans la partie "MM")Analyse des chaînes DateTime

Je ne peux pas obtenir cette routine pour travailler avec des mois à un chiffre! Microsofts propre exemple de MSDN est

6/15/2009 1:45:30 PM -> 6/15/2009 (en-US)

et il ne fonctionnera pas avec cela. Je ne comprends pas ce que je fais de mal. J'ai également essayé mes propres spécificateurs de format comme "mm/jj/aaaa" et "MM/jj/aaaa" mais en vain.

Répondre

6

Si vous voulez analyser un DateTime au format en États-Unis, vous devez spécifier la culture en-US:

DateTime.ParseExact("6/15/2009", "d", CultureInfo.GetCultureInfo("en-US")); 
+0

Pourquoi dois-je préciser que la culture? aussi, ce n'est pas ParseExact. Nous savons exactement de quel format proviennent les chaînes de date, pourquoi une chaîne de format ne peut-elle pas être utilisée? En utilisant ceci, nous pourrions apporter des choses qui ne devraient pas être là (spécifier l'heure dans un champ date est un non non) – Earlz

+0

J'ai changé mon exemple pour ParseExact. Vous devez spécifier une culture parce que vous dites que vous voulez que votre entrée soit analysée d'une manière spécifique à la culture (à savoir au format en-US). – dtb

+0

Ok, je pensais juste que Invariant signifiait US .. merci beaucoup! – Earlz

4

Je pense que vous voulez utiliser:

format = "M/dd/yyyy"; 

Avis seulement 1

Voir this article on MSDN pour confirmation et plus de détails.

+0

Non, c'est faux. Cela fera en sorte que "15/11/2009" devient "15/01/2009" – Earlz

+2

Avez-vous déjà essayé? Parce que j'ai, et cela semble fonctionner (15/11/2009 ne devient pas 15/01/2009). Le 1 'M' indique simplement de ne pas ajouter un zéro devant les mois à un chiffre (un peu comme si ToString ("0") sur un Integer renvoyait le nombre sans zéros de remplissage). –

+0

Dan a raison. Vous ne comprenez pas ce que signifie la chaîne de format si vous pensez qu'elle va convertir 11 -> 1 sans le M. M. – davewasthere

1

ParseExact exige que vous utilisez le spécificateur exacte de format long (par exemple jj/mm/aaaa) au lieu de « d »

+0

Cela donnera toujours une exception. Si je cloue sur un "0" pour faire quelque chose comme "20/06/2009" alors il va tout analyser correctement, mais le mois sera 1, donc ce sera "20/01/2009" et cela ne fait pas sens. – Earlz

0

Le caractère «/» lorsqu'il est utilisé dans les chaînes de format est juste un espace réservé pour le culture- caractère de séparation de date spécifique. Si vous voulez qu'il soit littéral, vous devez y échapper avec '\'.

Si je comprends bien votre problème, vous pourrez peut-être analyser votre texte:

DateTime.ParseExact(data, "MM\/dd\/yyyy", CultureInfo.InvariantProvider);