marzo 5, 2018

Leer datos de entrada del usuario con Go

Introducción

En la mayoría de programas por consola, necesitamos que el usuario introduzca datos. Ya sea para pedirle información o para hacer que seleccione determinada acción. Hoy veremos cómo leer datos por consola en el maravilloso lenguaje de programación Go.

Leer entrada del teclado

Para esto necesitamos crear un reader, que lea hasta un separador. En este caso el separador será el salto de línea; el que se escribe al presionar la tecla Enter.

Después, como la entrada de datos contiene el salto de línea que utilizamos como separador, hay que limpiarla; es en donde usamos TrimRight.

Finalmente hacemos un switch para comparar la entrada del usuario, y listo. Este ejemplo es muy sencillo, pero a la vez ilustra cómo podemos leer datos del teclado en Go.

Código de ejemplo

El código fuente que se explica arriba está escrito aquí abajo. Imprimimos un mensaje en donde preguntamos al usuario qué cosa prefiere. Si es una de las dos opciones que le damos, le avisamos. En caso de que no, indicamos que prefiere otra cosa.

Ejecución

Así se ve el código una vez que lo compilamos:

Ajustando fechas en Javascript

Introducción

No sé si sólo a mí me pasa o si sólo yo ocupo las fechas en Javascript, pero siempre que intento compararlas, algunas salen mal debido al offset. Sé que no se debe confiar en las fechas del cliente, pues se pueden cambiar, pero en alguna ocasión debimos necesitar trabajar con estas y puede que nos haya dado resultados inesperados.
Así que hoy mostraré cómo “ajustar el tiempo” de las fechas de Javascript utilizando getTimezoneOffset.

Descripción del problema

Esto pasa cuando creamos un objeto fecha utilizando una fecha como cadena. En donde la cadena es algo como “2018-03-05” (que representa el 5 de marzo del 2018 ). El objeto se crearía de la siguiente manera:

Nosotros esperamos que la fecha sea el 5 de marzo del 2018 a las 12 de la noche, o a las 00:00:00. Pero al imprimirlo...

Sorpresa. Dice que la fecha es del domingo (sunday) 4 de marzo a las 6 de la tarde. Y nosotros esperábamos que fuera del lunes 5 de marzo a las 0 horas.

Lo que está pasando aquí es que se están restando las horas del Tiempo universal coordinado (creo); en mi caso, como soy de México, resta 6 horas. ¿y si no estamos en México?

Javascript provee una forma de obtener el offset de la fecha. Y con ello podemos arreglar las fechas.

Vamos a ver la solución más abajo.

Solución

Esto es simple, al objeto que ya hemos creado vamos a ponerle el tiempo en milisegundos como el resultado de los milisegundos que ya tiene, sumando los milisegundos que resultan al obtener el offset. Para no confundirnos, se hace así:

Expliquemos esto.

setTime recibe un número, que es el tiempo en milisegundos que han pasado desde la fecha unix.

getTimezoneOffset devuelve en minutos la diferencia de tiempos; en este caso devolverá 360, pues son 6 horas multiplicadas por 60 minutos.

Estos 360 minutos los multiplicamos por 60 para pasarlos a segundos, y luego al resultado lo multiplicamos por 1000 para convertirlo a milisegundos.

Con eso, hacemos la resta. Obtenemos los milisegundos que ya tiene la fecha con getTime y a eso le sumamos el resultado que obtuvimos arriba.

En pocas palabras, se le suman los milisegundos de la diferencia de horas. Si después de hacer esto imprimo la fecha, tengo esto:

Correcto. La fecha ahora sí es del lunes a las 12 de la noche. Y este método, me parece, funciona para cualquier zona horaria.

Así, podemos arreglar y ajustar fechas en Javascript sin perder la cabeza.

Conclusión

Cabe mencionar que esto sólo me ha pasado al instanciar objetos con una fecha ya existente; si se instancia y no se le pasan parámetros, todo va bien. Es decir, si hago lo siguiente todo va bien:

Se desajusta cuando al constructor de Date le paso una cadena como argumento.