web-dev-qa-db-fra.com

La chaîne n'a pas été reconnue comme date/heure valide "format jj/mm/aaaa"

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

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

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

Quel est le problème? Il a une deuxième dérogation qui demande IFormatProvider. Qu'est-ce que c'est? _ {Do J'ai besoin de passer ça aussi? Si oui, comment l'utiliser dans ce cas?

Modifier  

Quelles sont les différences entre Parse et ParseExact?

Modifier 2

Les deux réponses de Slaks et de Sam fonctionnent pour moi, actuellement, l'utilisateur donne son entrée, mais je lui assurerai qu'elles sont valides en utilisant maskTextbox.

Quelle est la meilleure réponse compte tenu de tous les aspects tels que la sécurité de type, la performance ou quelque chose que vous souhaitez

142
Shantanu Gupta

Utilisez DateTime.ParseExact.

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

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

Vous devez appeler ParseExact , qui analyse une date correspondant exactement au format fourni.

Par exemple:

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

Le paramètre IFormatProvider spécifie la culture à utiliser pour analyser la date.
Si votre chaîne ne provient pas de l'utilisateur, vous devez passer CultureInfo.InvariantCulture.
Si la chaîne provient de l'utilisateur, vous devez passer CultureInfo.CurrentCulture, qui utilisera les paramètres spécifiés par l'utilisateur dans Options régionales du Panneau de configuration.

39
SLaks

L'analyse d'une représentation sous forme de chaîne d'un DateTime est une tâche délicate, car différentes cultures ont des formats de date différents. .Net connaît 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 "22/11/2009" ne correspond pas à ShortDatePattern pour les États-Unis (en-US) mais correspond à la France (fr-FR).

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

Par exemple, ceci analysera votre date correctement:

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

Bien sûr, vous ne devriez pas choisir la France au hasard, mais plutôt quelque chose d’adapté à vos besoins.

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

18
Greg

Bien que les solutions ci-dessus soient efficaces, vous pouvez également modifier le fichier webconfig avec les éléments suivants ...

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

Réf: Le format de date/heure diffère sur la machine locale par rapport à la machine de production

15
Amit Philips

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

    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, allez ici:

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

8
Ricardo Sanchez
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}
2
Bala Kumar

Basé sur cette référence , la prochaine approche a fonctionné pour moi:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
2
Jesús Castro

Après avoir passé beaucoup de temps, j'ai résolu le problème

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
2
atik sarker

utilisez ceci pour convertir une chaîne en date/heure:

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
2
AshifJM

Comme l’a dit quelqu'un ci-dessus, vous pouvez l’envoyer en tant que paramètre de chaîne, mais il doit avoir le format suivant: «20130121», par exemple, et vous pouvez le convertir en ce format en le prenant directement depuis le contrôle. Donc, vous l'obtiendrez par exemple dans une zone de texte comme:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

pour le convertir en: '20130121', vous utilisez:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

afin que SQL puisse le convertir et le mettre dans votre base de données.

1
G Jeny Ramirez

Un moyen facile sans références externes:

public string FormatDate(string date, string format)
{
   try {
      return DateTime.Parse(date).ToString(format);
   }
   catch (FormatException) 
   {
      return string.Empty;
   }
}
0
David Castro

Travaillé pour moi sous le code:

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

Espace de noms

using System.Globalization;
0
Anjan Kant

Vous pouvez aussi utiliser

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day
0
Serkan Hekimoglu