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