219 votes

La chaîne n'a pas été reconnue comme une DateTime valide " format dd/MM/yyyy ".

J'essaie de convertir ma valeur formatée en chaîne de caractères en type de date avec un format dd/MM/yyyy .

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);

Quel est le problème ? Il y a une deuxième dérogation qui demande IFormatProvider . Qu'est-ce que c'est ? Faites Je dois aussi le passer ? Si oui, comment l'utiliser dans ce cas ?

Modifier

Quelles sont les différences entre Parse et ParseExact ?

Edit 2

Les deux réponses de Slaks et Sam fonctionnent pour moi, actuellement l'utilisateur donne l'entrée mais je vais m'assurer qu'ils sont valides en utilisant maskTextbox.

Quelle réponse est la meilleure en considérant tous les aspects comme la sécurité du type, la performance ou quelque chose que vous sentez comme

7 votes

@Edit : C'est à cela que sert la documentation. msdn.microsoft.com/fr/us/library/w2sa9yss.aspx

2 votes

ParseExact est pour quand vous connaissez le format exact de la chaîne de date, Parse est quand vous voulez quelque chose qui peut gérer quelque chose d'un peu plus dynamique.

314voto

Samuel Neff Points 35554

Utilisez DateTime.ParseExact .

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);

20 votes

Pourquoi devons-nous passer null ici ?

3 votes

L'entrée peut être "22/11/2009 12:00:00 AM" ou "22/11/2009". De plus, la culture de la machine de développement peut être différente de celle de la machine de production. Le code ci-dessus fonctionnera-t-il sans problème ?

10 votes

@Rahat, parse exact ne fonctionnera pas si le format ne correspond pas. Le modèle de format ci-dessus est dd/MM/yyyy donc une chaîne de texte contenant une heure ne sera pas analysée correctement. Vous devrez soit enlever l'heure, soit l'inclure dans le modèle de format. Il existe une surcharge de ParseExact qui accepte un tableau de modèles de format et analysera le texte s'il correspond à l'un d'entre eux.

56voto

SLaks Points 391154

Vous devez appeler ParseExact qui analyse une date qui correspond exactement au format que vous fournissez.

Par exemple :

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

Le site IFormatProvider spécifie la culture à utiliser pour analyser la date.
A moins que votre chaîne ne provienne de l'utilisateur, vous devez passer CultureInfo.InvariantCulture .
Si la chaîne de caractères provient bien de l'utilisateur, vous devez passer le code suivant CultureInfo.CurrentCulture qui utilisera les paramètres spécifiés par l'utilisateur dans les Options régionales du Panneau de configuration.

2 votes

@Slaks : CultureInfo.InvariantCulture n'est pas disponible dans le code. Dois-je utiliser un espace de nom

3 votes

using System.Globalization;

2 votes

Vous pouvez également cliquer avec le bouton droit de la souris sur l'erreur et cliquer sur résoudre, ce qui vous permettra d'insérer l'espace de nom manquant.

23voto

Greg Points 11257

L'analyse syntaxique d'une chaîne de représentation d'un DateTime est délicate car les formats de date varient selon les cultures. .Net est conscient de ces formats de date et les extrait de votre culture actuelle ( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat ) lorsque vous appelez DateTime.Parse(this.Text) ;

Par exemple, la chaîne de caractères "22/11/2009" ne correspond pas à la chaîne de caractères de l'article 1. ShortDatePattern pour les États-Unis (en-US) mais il correspond pour la France (fr-FR).

Maintenant, vous pouvez soit appeler DateTime.ParseExact et transmettre la chaîne de format exacte que vous attendez, ou vous pouvez transmettre une culture appropriée à DateTime.Parse pour analyser la date.

Par exemple, ceci analysera correctement votre date :

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

Bien sûr, vous ne devez pas choisir la France au hasard, mais quelque chose qui correspond à vos besoins.

Ce que vous devez découvrir, c'est ce que System.Threading.Thread.CurrentThread.CurrentCulture et si/pourquoi il diffère de ce que vous attendez.

1 votes

Votre solution ne fonctionne pas pour moi il donne l'erreur comme "String was not recognized as a valid DateTime." et je passe la date d'entrée suivante : "13/06/17" à votre solution mais il donne l'erreur.Plz m'aider.

18voto

Amit Philips Points 69

Bien que les solutions ci-dessus soient efficaces, vous pouvez également modifier le fichier webconfig avec ce qui suit...

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>

Ref : Le format des dates est différent sur la machine locale et sur la machine de production.

1 votes

Amit Philips, vous avez sauvé ma journée J'avais essayé toutes les choses possibles. Et ce petit changement fonctionne. Merci.

3 votes

Amit, tu es vraiment le fils de Dieu.

13voto

Ricardo Points 2388

Vous devrez peut-être spécifier la culture pour ce format de date spécifique, comme dans :

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy

    this.Text="22/11/2009";

    DateTime date = DateTime.Parse(this.Text);

Pour plus de détails, cliquez ici :

http://msdn.microsoft.com/en-us/library/5hh873ya.aspx

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