Usuario
¿Como solucionar "La conversión del tipo de datos datetime2 en datetime produjo un valor fuera de intervalo."

Pregunta
-
Perdón si la pregunta es tonta, pero estoy empezando en este mundo. Mi problema es que he modificado la tabla de usuarios en ASP.Identity 2 para incluir un campo de fecha, pero como la base de datos (MSQL 2012) está en un servidor cuyo formato de fecha es yyyy-mm-dd, si la introduzco como dd-mm-yyyy, se produce el error. Por ejemplo, he probado:
// crear usuario protected void CreaUs(object sender, EventArgs e) { // poner un fecha ficticia si no se ha introducido para evitar un valor nulo string Fn = BoxFechaN.Text; if ((String.IsNullOrEmpty(Fn))) { Fn = "01/01/3000"; } //Intentando convertir el string en DateTime IFormatProvider MiFp = new System.Globalization.CultureInfo("es-Es", false); DateTime fechaR = new DateTime(); fechaR = System.DateTime.ParseExact(Fn, "dd-MM-yyyy", MiFp); // var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>(); var signInManager = Context.GetOwinContext().Get<ApplicationSignInManager>(); var user = new ApplicationUser() { UserName = TextUsuario.Text, Email = TextMail.Text, FechaNace = fechaR, genero = RadioGen.SelectedValue, puntos = 25 }; IdentityResult result = manager.Create(user, TextContra.Text); if (result.Succeeded) { // Para obtener más información sobre cómo habilitar la confirmación de cuentas y el restablecimiento de contraseña, visite http://go.microsoft.com/fwlink/?LinkID=320771 string code = manager.GenerateEmailConfirmationToken(user.Id); string callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request); manager.SendEmail(user.Id, "Confirmar cuenta", "Para confirmar la cuenta, haga clic <a href=\"" + callbackUrl + "\">aquí</a>."); signInManager.SignIn(user, isPersistent: false, rememberBrowser: false); IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response); } else { ErrorMessage.Text = result.Errors.FirstOrDefault(); } } }
Agradecería cualquier ayuda.
Todas las respuestas
-
Hola Moni
Prueba con esto:
string fecha = "02/08/2016"; // 02 de agosto de 2016
DateTime fecha convertirfecha = Convert.ToDateTime(fecha);
Saludos,
Miguel Torres
- Editado Miguel Torres C miércoles, 3 de agosto de 2016 2:58
-
Hola Moni65,
Si bien, no puedes modificar el formato de fecha que viene, puedes convertir al tipo DateTime, para posteriormente cambiarle el formato.
- No necesitar crear una nueva instancia del DateTime (new Datetime).
//string Fn = null; string Fn = "02-08-2016"; if (String.IsNullOrEmpty(Fn)) Fn = "01-01-3000"; DateTime convertida = DateTime.ParseExact(Fn, "dd-MM-yyyy", CultureInfo.CreateSpecificCulture("es-Es")); //convertida.ToString("yyyy-MM-dd"); //Si Fn es nulo => 3000-01-01 //Si es la fecha => 2016-08-02
Nótese que en tu validación, si el campo viene nulo o vacío, tendrías que mandarle el valor por defecto con el formato dd-MM-yyyy, así cuando lo parsee no tengas problemas.
No olvidar agregar el using :
using System.Globalization;
Saludos.
JC NaupaCrispín
Lima - Perú
La magia no existe, la programación SI -
Gracias a los dos, Miguel y Jc, pero ninguna de las dos cosas me funciona. Sigue apareciendo el mismo error de valor fuera de intérvalo. Ayer me tiré como 5 horas leyendo todo lo que encontré sobre DateTime y conversiones de tipos de datos y creo que ya lo he probado todo.
Lo más curiosos es que he puesto una etiqueta que recoja el valor literal de la fecha introducida sin realizar ninguna modificación y el resultado es en formato "yyyy-MM-dd", que se supone que es el que acepta la Db del Servidor, con lo cual ya no entiendo absolutamente nada.
Voy a trabajar con otras tablas a las que envío fechas con mi propio código y si resulta supongo que lo siguiente será olvidarse del Identity e implementar un Membership personalizado, que no me veo muy capaz, pero vamos, a todo se aprende. Al fin y al cabo para mi pequeña web tampoco necesito tanta cosa.
Ya os cuento.
-
He hecho una página nueva sin el Identity y he depurado el código en VS para ir viendo que valor de fecha producía cada conversión, y ninguna de ellas consigue el valor {yyyy/mm/dd 0:00:00} que necesito. En negrita he puesto el valor que me da cada fecha convertida. Cómo vereis da igual que la cadena original sea en inglés o en español, o que función utilice para convertirla en fecha. El resultado es siempre el mismo.
protected void Probar(object sender, EventArgs e) { string UsFecha = "2000-12-31"; //Fecha en Ingles-US string EsFecha = "31-12-2000"; //Fecha en Español //Prueba 1 Convert.ToDateTime (string) DateTime UsFechaPrueba1 = Convert.ToDateTime(UsFecha); DateTime EsFechaPrueba1 = Convert.ToDateTime(EsFecha); //Valor de las variables (Depurador vs) // UsFechaPrueba1 {31/12/2000 0:00:00} System.DateTime // EsFechaPrueba1 {31/12/2000 0:00:00} System.DateTime //Prueba 2 = DateTime.Parse(string, CultureInfo.CreateSpecificCulture("es-Es")) DateTime UsFechaPrueba2 = DateTime.Parse(UsFecha, CultureInfo.CreateSpecificCulture("es-Es")); DateTime EsFechaPrueba2 = DateTime.Parse(EsFecha, CultureInfo.CreateSpecificCulture("es-Es")); //UsFechaPrueba2 {31/12/2000 0:00:00} System.DateTime // EsFechaPrueba2 {31/12/2000 0:00:00} System.DateTime //Prueba 3 = DateTime.Parse(string, CultureInfo.CreateSpecificCulture("en-US")) DateTime UsFechaPrueba3 = DateTime.Parse(UsFecha, CultureInfo.CreateSpecificCulture("en-US")); //DateTime EsFechaPrueba3= DateTime.Parse(EsFecha, CultureInfo.CreateSpecificCulture("en-US")); ESTA DA ERROR. NO RECONOCE LA CADENA //UsFechaPrueba3 {31/12/2000 0:00:00} System.DateTime //Prueba 4 = = DateTime.ParseExact(string,"yyyy-MM-dd",CultureInfo.CreateSpecificCulture("es-Es")); DateTime UsFechaPrueba4 = DateTime.ParseExact(UsFecha, "yyyy-MM-dd", CultureInfo.CreateSpecificCulture("en-Us")); DateTime EsFechaPrueba4 = DateTime.ParseExact(EsFecha, "dd-MM-yyyy", CultureInfo.CreateSpecificCulture("en-Es")); // UsFechaPrueba4 {31/12/2000 0:00:00} System.DateTime // EsFechaPrueba4 {31/12/2000 0:00:00} System.DateTime //Prueba 5 = IFormatProvider MiFp = new System.Globalization.CultureInfo("en-Us", false) + convert.ToDateTime; IFormatProvider MiFp = new System.Globalization.CultureInfo("en-Us", false); DateTime UsFechaPrueba5 = Convert.ToDateTime(UsFecha, MiFp); DateTime EsFechaPrueba5 = Convert.ToDateTime(UsFecha, MiFp); // UsFechaPrueba5 {31/12/2000 0:00:00} System.DateTime // EsFechaPrueba5 {31/12/2000 0:00:00} System.DateTime //Prueba 6 = DateTime fechaR = System.DateTime.ParseExact(string, "formato", MiFp ); DateTime UsFechaPrueba6 = System.DateTime.ParseExact(UsFecha, "yyyy-MM-dd", MiFp); DateTime EsFechaPrueba6 = System.DateTime.ParseExact(EsFecha, "dd-MM-yyyy", MiFp); // UsFechaPrueba6 {31/12/2000 0:00:00} System.DateTime // EsFechaPrueba6 {31/12/2000 0:00:00} System.DateTime }