Publi

domingo, 13 de abril de 2014

Cálculo de fechas en app inventor

Buenas.
Perdonad la ausencia de tanto tiempo en el blog, pero las circustancias del trabajo me han hecho imposible continuar de forma asidua el desarrollo del mismo.

Hoy traigo una pequeña explicación de cómo podemos tratar y operar con fechas en app inventor.

El que haya programado anteriormente habrá comprobado que el tema de fechas y sus operaciones es en muchas ocasiones una "odisea". Hay lenguajes que sí tienen muchas funciones desarrolladas para ello, y otros no tantas ... y tenemos que generarlas nosotros mismos.

App inventor nos da una serie de opciones, definidas en el control RELOJ (Clock)



No es que sea excepcional, pero sí nos va a permitir seguir desarrollando opciones y funciones sobre las que ya nos da el objeto.

Vamos a trabajar sobre un problema real, que me propuso Luis Oliveros en una entrada anterior.

ENUNCIADO :
Queremos saber cuántas semanas y días nos quedan desde hoy hasta un día concreto (en el caso de Luis, el del nacimiento de un hijo/hija).
Por tanto partimos que sabemos la fecha final (prevista).

Nota:
Este programa se puede utilizar para hacer una cuenta atrás, por ejemplo, para saber cuánto tiempo queda para empezar el mundial, cuánto tiempo queda para que llegue el próximo año, cuánto tiempo queda para nuestro cumpleaños,...


QUÉ VAMOS A UTILIZAR:
Vamos a necesitar
  • un objeto Clock, que será el elemento fundamental de nuestro programa.
  • Tres objetos TextBox en el que insertaremos DÍA/ MES / AÑO sobre el que queremos calcular cuánto falta
  • un objeto Label, en el que mostraremos la información
  • un objeto Button, que nos realizará los cálculos pertinentes
  • varias variables definidas por nostros que nos servirán para ir guardando la información que necesitaremos
Nota: todos estos objetos los hemos visto en otros Post (excepto Clock). Si tienes alguna duda de dichos objetos, consulta los Post anteriores.

 CÓMO VA A SER EL PROCESO:
  • Vamos a rellenar los 3 TextBox con el día mes y año (fecha final) sobre la que queremos calcular cuánto falta para que llegue dicho día.
  • Cuando pulsemos sobre el Button, comprobaremos qué día es HOY y calcularemos el número de milisegundos que hay entre la fecha de hoy y la fecha final (con el objeto Clock)
  • Una vez que tenemos el número de milisegundos entre las 2 fechas... "sólo" hay que convertir esos milisegundos  en lo que deseemos (en nuestro caso, cuántas semanas y días, ... pero fácilmente podriamos calcular horas, minutos, años, ... lo que nos interese) (guardaremos estos datos calculados en variables)
  • Finalmente lo presentaremos en el Label que hemos preparado para mostrar la información.
COMENZAMOS ...


  1. Creamos un nuevo proyecto, llamado CuantoQueda
  2. Insertamos los elementos que hemos comentado anteriormente (para darle una mejor visualización, he añadido alguno más,...pero eso no es lo importante en este proyecto)
  3. Una vez tenemos la estructura, abrimos el "Block Editor" y generamos los siguientes bloques:
  4.  




  1. Vemos que definimos 3 variables:
  2.  
    • fecha_actual, en la que guardamos la fecha y hora actual, que nos servirá para calcular cuánto nos queda hasta la fecha final
    • milisegundos_total, en la que guardaremos cuántos milisegundos hay entre la fecha actual y la fecha final.
    • dias, en la que guardaremos cuántos días supone esos milisegundos entre las 2 fechas.
  3. A continuación observamos la primera acción a realizar cuando hacemos Click sobre el botón, que es la de guardar la fecha actual con la función reloj.Now (nos devuelve un 'Instant', que es el elemento de fecha que entiende App Inventor, que no es mas que el número de milisegundos que hay entre 01/01/1970 y el momento actual ...¿¿?¿¿?¿?¿?¿?? .... no te preocupes de cómo funciona internamente el objeto Clock. Por ahora sólo tienes que saber que 'Now' te devuelve la fecha (y hora) actual.
  4. Posteriormente, con dicha fecha actual y la fecha final (la creamos mediante el formato anglosajón MM/DD/AAAA), calculamos cuántos milisegundos hay entre estas 2 fechas, mediante la función de Clock llamada 'Duration', concretamente con reloj.Duration
  5.  
  6. Una vez que tenemos los milisegundos que faltan ... ya hay poco que hacer: Convertirlo a la unidad de tiempo que queramos. ¿Cómo?, pues como lo haríamos en un ejercicio de primaria...sabiendo pasar de milisegundos a segundos (dividiendo entre 1000), sabiendo pasar segundos a minutos (dividiendo entre 60), minutos a horas (dividiendo entre 60), horas en días (dividiendo entre 24), días en semanas (dividiendo entre 7),... Eso os lo dejo a vuestro conocimiento de conversión entre medidas de tiempo...cosa que está fuera del objetivo de la enseñanaza de la programación en App Inventor. En este caso en concreto, lo vamos a pasar a días, y utilzamos la siguiente función para calcular el número total de días entre las 2 fechas (pasamos los milisegundos a días)
  7. La función 'ceiling' redondea un número con decimales al siguiente número Entero. Por ejemplo, el 7,2 nos devuelve 8 (cuando quedan 7,2 días para algo...realmente quedan 8 días)
  8. Finalmente, rellenamos el Label de los resultados, con los cálculos pertienentes. Aquí sólo os voy a explicar un poco las funciones
  9.  
  10. 'quotient' nos sirve para quedarnos con la parte entera de una división, es decir, por ejemplo, si dividimos 20/7, esta división da como resultado 2,857142857, con lo que quotient nos devuelve el 2 (la parte entera del número)
  11. Por otra parte está
  12. que calcula el número de días "sobrantes" de las semanas completas, es decir, al total de días, le resta el número de días que hay en las semanas que quedan hasta la fecha final, quedándonos los días que no "rellenan" una semana (de 0 a 6 días nos dará esta operación).
  13. Y aquí hemos terminado el ejercicio.
Os dejo el fichero del proyecto para que lo descargueis y lo probeis. No olvideis preguntar lo que os pueda surgir

Espero que os sirva!


3 comentarios:

  1. me podrias orientar, para la creacion de una aplicacion? no he encontrado ningun formulario de contacto. Si pudieras contactarme cordobessa@hotmail.es

    ResponderEliminar
  2. Si en lugar de cargar una fecha, introduzco un Selector de Fecha y un Selector de Hora, como los concateno para poder hacer la diferencia con la fecha y hora actual? Te agradezco la respuesta. Ruben

    ResponderEliminar
    Respuestas
    1. Estaba buscando hacer eso mismo pero no hay caso... no me sale....

      Eliminar