Ich versuche, meinen String-formatierten Wert mit dem Format dd/MM/yyyy
in einen Datentyp zu konvertieren.
this.Text="22/11/2009";
DateTime date = DateTime.Parse(this.Text);
Was ist das Problem? Es hat eine zweite Überschreibung, die nach IFormatProvider
fragt. Was ist das? Do Ich muss das auch weitergeben? Wenn ja, wie man es für diesen Fall benutzt?
Bearbeiten
Was sind die Unterschiede zwischen Parse
und ParseExact
?
Bearbeiten 2
Beide Antworten von Slaks und Sam arbeiten für mich, derzeit gibt der Benutzer die Eingabe, aber dies wird von mir versichert, dass sie durch die Verwendung von maskTextbox gültig sind.
Welche Antwort ist besser, wenn Sie alle Aspekte wie Sicherheit, Leistung oder etwas, das Sie möchten, berücksichtigen
Verwenden Sie DateTime.ParseExact
.
this.Text="22/11/2009";
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Sie müssen ParseExact
aufrufen, um ein Datum zu analysieren, das genau einem von Ihnen angegebenen Format entspricht.
Zum Beispiel:
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);
Der Parameter IFormatProvider
gibt die Kultur an, die zum Analysieren des Datums verwendet wird.
Wenn Ihre Zeichenfolge nicht vom Benutzer stammt, sollten Sie CultureInfo.InvariantCulture
übergeben.
Wenn die Zeichenfolge vom Benutzer stammt, müssen Sie CultureInfo.CurrentCulture
übergeben. In diesem Fall werden die Einstellungen verwendet, die der Benutzer in den Systemeinstellungen in den Ländereinstellungen angegeben hat.
Das Parsen einer Zeichenfolgendarstellung einer DateTime ist eine schwierige Sache, da unterschiedliche Kulturen unterschiedliche Datumsformate haben. .Net kennt diese Datumsformate und holt sie aus Ihrer aktuellen Kultur (System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat
), wenn Sie DateTime.Parse(this.Text)
aufrufen.
Zum Beispiel stimmt die Zeichenfolge "22/11/2009" nicht mit dem ShortDatePattern für die Vereinigten Staaten (en-US) überein, aber für Frankreich (fr-FR).
Jetzt können Sie entweder DateTime.ParseExact
aufrufen und die genaue Formatzeichenfolge übergeben, die Sie erwarten, oder Sie können eine geeignete Kultur an DateTime.Parse
übergeben, um das Datum zu analysieren.
Zum Beispiel wird das Datum korrekt analysiert:
DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );
Natürlich sollten Sie nicht zufällig Frankreich auswählen, sondern etwas, das Ihren Bedürfnissen entspricht.
Was Sie herausfinden müssen, ist, worauf System.Threading.Thread.CurrentThread.CurrentCulture
eingestellt ist und ob/warum es von den Erwartungen abweicht.
Obwohl die oben genannten Lösungen effektiv sind, können Sie die webconfig-Datei auch mit den folgenden Einstellungen ändern:.
<configuration>
<system.web>
<globalization culture="en-GB"/>
</system.web>
</configuration>
Ref: Datetime-Format auf lokaler Maschine anders als bei Produktionsmaschine
Möglicherweise müssen Sie die Kultur für dieses bestimmte Datumsformat wie folgt angeben:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy
this.Text="22/11/2009";
DateTime date = DateTime.Parse(this.Text);
Für weitere Details gehen Sie hier:
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;
}
Basierend auf dieser Referenz funktionierte der nächste Ansatz für mich:
// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017"
var formatInfo = new DateTimeFormatInfo()
{
ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
Nachdem ich viel Zeit verbracht habe, habe ich das Problem gelöst
string strDate = PreocessDate(data);
string[] dateString = strDate.Split('/');
DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);
verwenden Sie diese Option, um eine Zeichenfolge in datetime zu konvertieren:
Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)
Genau wie zuvor gesagt, können Sie es als String-Parameter senden, es muss jedoch das folgende Format haben: '20130121' und Sie können es in dieses Format konvertieren, indem Sie es direkt aus dem Steuerelement nehmen. So erhalten Sie es zum Beispiel aus einem Textfeld wie:
date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"
um es zu konvertieren in: '20130121' verwenden Sie:
date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);
damit SQL es konvertieren und in Ihre Datenbank aufnehmen kann.
Ein einfacher Weg ohne externe Referenzen:
public string FormatDate(string date, string format)
{
try {
return DateTime.Parse(date).ToString(format);
}
catch (FormatException)
{
return string.Empty;
}
}
Arbeitete für mich unter dem Code:
DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));
Namespace
using System.Globalization;
Sie können auch verwenden
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