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

172

Ich versuche, meinen mit Zeichenfolgen formatierten Wert in den Datumstyp mit Format zu konvertieren dd/MM/yyyy.

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

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

Was ist das Problem ? Es hat eine zweite Überschreibung, die verlangt IFormatProvider. Was ist das? Muss ich das auch bestehen? Wenn ja, wie wird es für diesen Fall verwendet?

Bearbeiten

Was sind die Unterschiede zwischen Parseund 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 mithilfe von maskTextbox gültig sind.

Welche Antwort ist besser, wenn Sie alle Aspekte wie Typensicherheit, Leistung oder etwas berücksichtigen, nach dem Sie sich fühlen

Shantanu Gupta
quelle
7
@ Edit: Dafür ist die Dokumentation gedacht. msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks
2
ParseExact ist, wenn Sie das genaue Format der Datumszeichenfolge kennen. Parse ist, wenn Sie etwas möchten, das etwas Dynamischeres verarbeiten kann.
Lebkuchenjunge

Antworten:

255

Verwenden Sie DateTime.ParseExact.

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

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);
Samuel Neff
quelle
8
Warum müssen wir hier null übergeben?
Shantanu Gupta
3
Die Eingabe kann "22/11/2009 12:00:00 AM" oder "22/11/2009" sein. Auch die Kultur der Entwicklungsmaschine kann sich von der Kultur der Produktion unterscheiden. Funktioniert der obige Code also nahtlos?
Rahatur
8
@ Rahat, genaues Parsen funktioniert nicht, wenn das Format nicht übereinstimmt. Das obige Formatmuster ist dd/MM/yyyyso, dass eine Textzeichenfolge mit einer Zeit darin nicht richtig analysiert wird. Sie müssen entweder die Zeit entfernen oder sie in das Formatmuster aufnehmen. Es gibt eine Überladung ParseExact, die ein Array von Formatmustern akzeptiert und den Text analysiert, wenn er mit einem von ihnen übereinstimmt.
Samuel Neff
7
@SamuelNeff Warum verwenden Sie nicht CultureInfo.InvariantCultureanstelle des aktuellen, wenn Sie trotzdem ein Format definieren?
Alvin Wong
3
@Toolkit Der Grund dafür ist, dass die Schrägstriche in der Formatzeichenfolge keine wörtlichen Schrägstriche sind. Sie werden in der aktuellen Kultur durch die Datums-Trennzeichenfolge ersetzt. Es hängt also von der Kultur ab, wie sie oben geschrieben steht. Samuel Neff, versuchen Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");Sie es , es wird Ihre Lösung brechen. Um dies zu beheben, verwenden Sie "dd'/'MM'/'yyyy"(Schutz der Schrägstriche mit einfachen Anführungszeichen) oder @"dd\/MM\/yyyy"("Entkommen" der Schrägstriche mit umgekehrten Schrägstrichen).
Jeppe Stig Nielsen
44

Sie müssen anrufen ParseExact, um ein Datum zu analysieren, das genau einem von Ihnen angegebenen Format entspricht.

Beispielsweise:

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

Der IFormatProviderParameter gibt die Kultur an, die zum Analysieren des Datums verwendet werden soll.
Sofern Ihre Zeichenfolge nicht vom Benutzer stammt, sollten Sie übergeben CultureInfo.InvariantCulture.
Wenn die Zeichenfolge vom Benutzer stammt, sollten Sie übergeben CultureInfo.CurrentCulture, wodurch die Einstellungen verwendet werden, die der Benutzer in den regionalen Optionen in der Systemsteuerung angegeben hat.

SLaks
quelle
2
@ Slaks: CultureInfo.InvariantCulture ist im Code nicht verfügbar. Muss ich einen Namespace verwenden
Shantanu Gupta
3
using System.Globalization;
SLaks
2
Sie können auch mit der rechten Maustaste auf den Fehler klicken und auf "Beheben" klicken. Dadurch wird der fehlende Namespace für Sie eingefügt.
Inkey
Sie können auch auf den Fehler
doppelklicken
Leerzeichen zählen ebenfalls. Wenn Ihr Zeichenfolgenformat beispielsweise "MM / TT / JJJJ HH: MM: SS" ist (Anmerkung - 2 Leerzeichen), muss Ihr Format für ParseExact auch die Leerzeichen enthalten
Chris Halcrow
20

Das Parsen einer Zeichenfolgendarstellung einer DateTime ist eine schwierige Sache, da verschiedene Kulturen unterschiedliche Datumsformate haben. .Net kennt diese Datumsformate und bezieht sie System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormatbeim Aufruf aus Ihrer aktuellen Kultur ( ) DateTime.Parse(this.Text).

Beispielsweise stimmt die Zeichenfolge "22/11/2009" nicht mit dem ShortDatePattern für die USA (en-US) überein, sondern mit Frankreich (fr-FR).

Jetzt können Sie entweder die DateTime.ParseExacterwartete Formatzeichenfolge aufrufen und übergeben, oder Sie können eine geeignete Kultur übergeben, DateTime.Parseum das Datum zu analysieren.

Dies analysiert beispielsweise Ihr Datum korrekt:

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

Natürlich sollten Sie Frankreich nicht zufällig auswählen, sondern etwas, das Ihren Bedürfnissen entspricht.

Was Sie herausfinden müssen, ist, was System.Threading.Thread.CurrentThread.CurrentCultureeingestellt ist und ob / warum es von Ihren Erwartungen abweicht.

Greg
quelle
Ihre Lösung funktioniert bei mir nicht. Es wird der Fehler "String wurde nicht als gültige DateTime erkannt" angezeigt. und ich übergebe folgendes Eingabedatum: "13/06/17" zu Ihrer Lösung, aber es gibt Fehler. Bitte helfen Sie mir.
Ghanshyam Lakhani
16

Obwohl die oben genannten Lösungen effektiv sind, können Sie die webconfig-Datei auch wie folgt ändern:

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

Ref: Datetime-Format auf lokaler Maschine anders als auf Produktionsmaschine

Amit Philips
quelle
1
Amit Philips, du hast meinen Tag gerettet. Ich hatte alle möglichen Dinge ausprobiert. Und diese kleine Änderung funktioniert. Vielen Dank.
RNH
1
Amit, du bist wirklich der Sohn Gottes.
Der wütende Bär
10

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);

Weitere Details finden Sie hier:

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

Ricardo Sanchez
quelle
4

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]);
Atik Sarker
quelle
3

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

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

Basierend auf dieser Referenz hat der nächste Ansatz für mich funktioniert:

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);
Jesús Castro
quelle
2
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;
}
Bala Kumar
quelle
1

Wie oben bereits erwähnt, können Sie es als Zeichenfolgenparameter senden, es muss jedoch das folgende Format haben: '20130121', und Sie können es in dieses Format konvertieren, indem Sie es direkt vom Steuerelement übernehmen. 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 einfügen kann.

G Jeny Ramirez
quelle
0

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
Serkan Hekimoglu
quelle
0

Arbeitete für mich unter Code:

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

Namespace

using System.Globalization;
Anjan Kant
quelle
-6

Manuell ändern:

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

Ab dem 22.11.2015 wird es am 22.11.2015 umgebaut

Sarta
quelle