web-dev-qa-db-de.com

Zeichenfolge wurde nicht als gültiges DateTime-Format "Format TT/MM/JJJJ" erkannt

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

142
Shantanu Gupta

Verwenden Sie DateTime.ParseExact.

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

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

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.

39
SLaks

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.

18
Greg

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

15
Amit Philips

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:

http://msdn.Microsoft.com/de-de/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

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);
2
Jesús Castro

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]);
2
atik sarker

verwenden Sie diese Option, um eine Zeichenfolge in datetime zu konvertieren:

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

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.

1
G Jeny Ramirez

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;
   }
}
0
David Castro

Arbeitete für mich unter dem Code:

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

Namespace

using System.Globalization;
0
Anjan Kant

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
0