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


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

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.


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.


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


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


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

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)

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

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

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.


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

0

Arbeitete für mich unter Code:

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

Namespace

using System.Globalization;

-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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.