La stringa non è stata riconosciuta come DateTime valido "format gg / MM / aaaa"


172

Sto cercando di convertire il mio valore in formato stringa in tipo di data con il formato dd/MM/yyyy.

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

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

Qual è il problema ? Ha una seconda sostituzione che chiede IFormatProvider. Cos'è questo? Non ho bisogno di passare anche questo? Se sì, come usarlo per questo caso?

modificare

Quali sono le differenze tra Parsee ParseExact?

Modifica 2

Entrambe le risposte di Slaks e Sam stanno lavorando per me, attualmente l'utente sta dando l'input ma questo mi sarà assicurato che sono valide usando maskTextbox.

Quale risposta è migliore considerando tutti gli aspetti come tipo di sicurezza, prestazioni o qualcosa che ti piace


7
@Edit: ecco a cosa serve la documentazione. msdn.microsoft.com/en-us/library/w2sa9yss.aspx
SLaks

2
ParseExact è per quando si conosce il formato esatto della stringa della data, Parse è quando si desidera qualcosa in grado di gestire qualcosa di più dinamico.
Gingerbreadboy,

Risposte:


255

Usa DateTime.ParseExact.

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

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

8
Perché dobbiamo passare null qui?
Shantanu Gupta,

3
L'ingresso può essere "22/11/2009 12:00:00" o "22/11/2009". Anche la cultura della macchina di sviluppo può essere diversa dalla cultura della produzione. Quindi il codice sopra funzionerà senza problemi?
Rahatur,

8
@Rahat, l'analisi esatta non funzionerà se il formato non corrisponde. Il modello di formato sopra è dd/MM/yyyyquindi una stringa di testo con un tempo in essa non verrà analizzata correttamente. Dovrai eliminare il tempo o includerlo nel modello di formato. C'è un sovraccarico ParseExactche accetta una serie di schemi di formato e analizzerà il testo se corrisponde a uno di essi.
Samuel Neff,

7
@SamuelNeff Perché non usi CultureInfo.InvariantCulturequello attuale se stai comunque definendo un formato?
Alvin Wong,

3
@Toolkit Il motivo è che le barre nella stringa di formato non sono barre letterali. Sono sostituiti dalla stringa di separazione della data nella cultura corrente. Quindi dipende dalla cultura nel modo in cui è scritta sopra. Samuel Neff, prova Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");, romperà la tua soluzione. Per risolvere il problema, utilizzare "dd'/'MM'/'yyyy"(proteggere le barre con virgolette singole) o @"dd\/MM\/yyyy"("sfuggire" alle barre con barre rovesciate).
Jeppe Stig Nielsen,

44

Devi chiamare ParseExact, che analizza una data che corrisponde esattamente a un formato che fornisci.

Per esempio:

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

Il IFormatProviderparametro consente di specificare la cultura da utilizzare per analizzare la data.
A meno che la tua stringa non provenga dall'utente, dovresti passare CultureInfo.InvariantCulture.
Se la stringa proviene dall'utente, è necessario passare CultureInfo.CurrentCulture, che utilizzerà le impostazioni specificate dall'utente in Opzioni internazionali nel Pannello di controllo.


2
@Slaks: CultureInfo.InvariantCulture non è disponibile nel codice. Devo usare un po 'di spazio dei nomi
Shantanu Gupta,

3
using System.Globalization;
SLaks

2
Puoi anche fare clic con il tasto destro sull'errore e fare clic su risolvi per inserire lo spazio dei nomi mancante per te.
Inkey

puoi anche fare doppio clic sull'errore e vedere una freccia in giù che mostra gli spazi dei nomi correlati che puoi usare
Usman Younas

Anche gli spazi contano, quindi ad esempio se il formato della stringa è "MM / gg / aaaa HH: mm: ss" (nota - 2 spazi) - quindi il formato per ParseExact deve includere anche gli spazi
Chris Halcrow

20

L'analisi di una rappresentazione in formato stringa di un DateTime è una cosa complicata perché culture diverse hanno formati di data diversi. .Net è a conoscenza di questi formati di data e li estrae dalla tua cultura corrente ( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat) quando chiami DateTime.Parse(this.Text);

Ad esempio, la stringa "22/11/2009" non corrisponde allo ShortDatePattern per gli Stati Uniti (en-US) ma corrisponde alla Francia (fr-FR).

Ora, puoi chiamare DateTime.ParseExacte passare l'esatta stringa di formato che ti aspetti, oppure puoi passare in una cultura appropriata DateTime.Parseper analizzare la data.

Ad esempio, questo analizzerà correttamente la tua data:

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

Naturalmente, non dovresti semplicemente scegliere in modo casuale la Francia, ma qualcosa di appropriato per le tue esigenze.

Quello che devi capire è cosa System.Threading.Thread.CurrentThread.CurrentCultureè impostato e se / perché differisce da quello che ti aspetti.


la tua soluzione non funziona per me, dà l'errore come "String non è stato riconosciuto come un DateTime valido." e sto passando la seguente data di input: "13/06/17" alla tua soluzione ma dà errore.Plz mi aiuti.
Ghanshyam Lakhani,

16

Sebbene le soluzioni di cui sopra siano efficaci, puoi anche modificare il file webconfig con il seguente ...

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

Rif: formato Datetime diverso sulla macchina locale rispetto alla macchina di produzione


1
Tra Philips, mi hai salvato la giornata .. Avevo provato tutte le cose possibili. E questo piccolo cambiamento funziona. Grazie.
RNH,

1
Amit, sei veramente il figlio di Dio.
The Furious Bear


4

Dopo aver trascorso molto tempo ho risolto il problema

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);

3

usalo per convertire la stringa in datetime:

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

3

Sulla base di questo riferimento , l'approccio successivo ha funzionato per me:

// 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

Proprio come qualcuno sopra ha detto che puoi inviarlo come parametro stringa ma deve avere questo formato: '20130121' per esempio e puoi convertirlo in quel formato prelevandolo direttamente dal controllo. Quindi lo otterrai ad esempio da una casella di testo come:

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

per convertirlo in: '20130121' usi:

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

in modo che SQL possa convertirlo e inserirlo nel database.


0

Puoi anche usare

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

Ha funzionato per me sotto il codice:

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

Spazio dei nomi

using System.Globalization;

-6

Cambia manualmente:

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

Dal 22/11/2015 sarà convertito in 22/11/2015

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.