A string não foi reconhecida como um formato de data / hora válido dd / mm / aaaa

Eu estou tentando converter meu valor formatado de seqüência de caracteres para o tipo de data com formato dd/MM/yyyy .

 this.Text="22/11/2009"; DateTime date = DateTime.Parse(this.Text); 

Qual é o problema ? Tem uma segunda substituição que pede IFormatProvider . O que é isso? Eu preciso passar isso também? Se sim como usá-lo para este caso?

Editar

Quais são as diferenças entre o Parse e o ParseExact ?

Editar 2

Ambas as respostas de Slaks e Sam estão trabalhando para mim, atualmente o usuário está dando a input, mas isso será assegurado por mim que elas são válidas usando maskTextbox.

Qual resposta é melhor considerando todos os aspectos como tipo de segurança, desempenho ou algo que você sente como

Use DateTime.ParseExact .

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

Você precisa chamar ParseExact , que analisa uma data que corresponde exatamente a um formato que você fornece.

Por exemplo:

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

O parâmetro IFormatProvider especifica a cultura a ser usada para analisar a data.
A menos que sua string venha do usuário, você deve passar CultureInfo.InvariantCulture .
Se a seqüência de caracteres vem do usuário, você deve passar CultureInfo.CurrentCulture , que usará as configurações que o usuário especificou em Opções regionais no painel de controle.

Analisar uma representação de string de um DateTime é uma coisa complicada porque diferentes culturas têm diferentes formatos de data. .Net está ciente desses formatos de data e os puxa de sua cultura atual ( System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat ) quando você chama DateTime.Parse(this.Text) ;

Por exemplo, a string “22/11/2009” não corresponde à ShortDatePattern para os Estados Unidos (en-US), mas corresponde à França (fr-FR).

Agora, você pode chamar DateTime.ParseExact e passar a string de formato exato que você está esperando, ou pode passar uma cultura apropriada para DateTime.Parse para analisar a data.

Por exemplo, isso analisará sua data corretamente:

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

Claro, você não deve escolher aleatoriamente a França, mas algo apropriado às suas necessidades.

O que você precisa descobrir é o que System.Threading.Thread.CurrentThread.CurrentCulture é definido como, e se / por que ele difere do que você espera.

Embora as soluções acima sejam eficazes, você também pode modificar o arquivo webconfig com o seguinte …

      

Ref: Formato de data e hora diferente na máquina local em comparação com a máquina de produção

Pode ser necessário especificar a cultura para esse formato de data específico, como em:

  Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); //dd/MM/yyyy this.Text="22/11/2009"; DateTime date = DateTime.Parse(this.Text); 

Para mais detalhes, clique aqui:

http://msdn.microsoft.com/pt-br/library/5hh873ya.aspx

use isso para converter string em datetime:

 Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat) 
 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; } 

Depois de passar muito tempo resolvi o problema

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

Com base nessa referência , a próxima abordagem funcionou para mim:

 // eg format = "dd/MM/yyyy", dateString = "10/07/2017" var formatInfo = new DateTimeFormatInfo() { ShortDatePattern = format }; date = Convert.ToDateTime(dateString, formatInfo); 

Assim como alguém acima disse que você pode enviá-lo como um parâmetro de seqüência de caracteres, mas deve ter este formato: ‘20130121’ por exemplo e você pode convertê-lo para esse formato tirá-lo diretamente do controle. Então você vai conseguir, por exemplo, de uma checkbox de texto como:

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

para convertê-lo em: ‘20130121’ você usa:

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

para que o SQL possa convertê-lo e colocá-lo em seu database.

Você também pode usar

 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 

Trabalhou para mim abaixo do código:

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

Namespace

 using System.Globalization; 

Uma maneira fácil sem referências externas:

 public string FormatDate(string date, string format) { try { return DateTime.Parse(date).ToString(format); } catch (FormatException) { return string.Empty; } } 

Alterar manualmente:

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

A partir de 22/11/2015 será convertido em 22/11/2015