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
Utilisez DateTime.ParseExact
.
this.Text="22/11/2009";
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
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.
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.
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
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:
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;
}
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);
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]);
utilisez ceci pour convertir une chaîne en date/heure:
Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
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.
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;
}
}
Travaillé pour moi sous le code:
DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));
Espace de noms
using System.Globalization;
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