por Dario » Vie Ene 22, 2010 5:49 pm
Hola juje,
Si la necesidad es que puedas pasar el formato de la fecha podés utilizar el siguiente código:
string Fecha = "2010-02-25";
DateTime FechaConvertida;
if (DateTime.TryParse(Fecha, new CultureInfo("es-AR"), DateTimeStyles.None, out FechaConvertida))
Fecha = FechaConvertida.ToString("dd/MM/yyyy");
else
{
if (DateTime.TryParse(Fecha, new CultureInfo("en-US"), DateTimeStyles.None, out FechaConvertida))
Fecha = FechaConvertida.ToString("dd/MM/yyyy");
else
throw new FormatException(string.Format("Unable to format date:{0}", Fecha));
}
Fijate que funciona aunque el formato de la fecha no sea exactamente dd/MM/yyyy, por ejemplo tambien funciona con dd-MM-yyyy o yyyy-MM-dd, Si necesitás que el formato sea exacto podés utilizar este código:
string Fecha = "2010-02-25";
DateTime FechaConvertida;
if (DateTime.TryParseExact(Fecha,"dd/MM/yyyy", new CultureInfo("es-AR"), DateTimeStyles.None, out FechaConvertida))
Fecha = FechaConvertida.ToString("dd/MM/yyyy");
else
{
if (DateTime.TryParseExact(Fecha,"MM/dd/yyyy", new CultureInfo("en-US"), DateTimeStyles.None, out FechaConvertida))
Fecha = FechaConvertida.ToString("dd/MM/yyyy");
else
throw new FormatException(string.Format("Unable to format date:{0}", Fecha));
}
Donde le estás exisgindo al string de entrada que tenga el formato especifico.
De todas formas el tema de que un usuario pueda ingresar una fecha en ambos formatos, o sea español o americano indistintamente, a mi parecer puede traerte un problema grave, ya que en una fecha del tipo:
25 de enero de 2010
Es bien claro cual es el dia y el mes, por lo que podés darte cuenta sin problemas si el formato es español ("25/01/2010") o americano ("01/25/2010") .
Pero de que forma podrías distinguir si un usuario esta escribiendo en español la fecha :
1 de Febrero del 2010 ("01/02/2010")
o está escribiendo en inglés la fecha 2 de enero de 2010 ("01/02/2010").
Ya no podés distingir el dia del mes y no sabés de que manera hay que convertir el string. Si no conocés la cultura del usuario es todo un problema.
Si en cambio si conocés la cultura del usuario quizás podrías exigirle que use el formato correspondiente a su cultura utilizando un CompareValidator como en este ejemplo:
<asp:TextBox runat="server" ID="TxtBx01" ValidationGroup="VG1"></asp:TextBox>
<asp:CompareValidator runat="server" ID="RV01" Operator="DataTypeCheck" ControlToValidate="TxtBx01"
ValidationGroup="VG1" Type="Date" Text="Fecha inválida"></asp:CompareValidator>
<asp:Button runat="server" ID="Btn01" ValidationGroup="VG1" Text="Aceptar" CausesValidation="true" />
incluso podrías utilizar el control CalendarExtender de Ajax para llenar el campo más amigablemente, el tema es que en este caso la cultura del thread debería estar establecida a la del usuario.
Espero que la respuesta te haya servido