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

  • 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.


    martes, 2 de agosto de 2016 23:43

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




    miércoles, 3 de agosto de 2016 0:39
  • 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

    miércoles, 3 de agosto de 2016 2:05
  • 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.

    miércoles, 3 de agosto de 2016 17:30
  • 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
    
      }

    miércoles, 3 de agosto de 2016 21:12