lunes, 27 de mayo de 2013

Javascript - Extensión objeto Date: Obtener hora y fecha según formato

Imagen tomada de:
hauteliving.com
Hace un buen rato venía luchando con javascript en cuanto a la obtención de horas y fechas.  Esto no es problema si se maneja con un lenguaje cercano al "bajo nivel" como C/C++ (ya lo he hecho) o incluso de lado del servidor como PHP, el único inconveniente es que al hacer pruebas con alrededor de 30 a 40 usuarios (en el caso de PHP), todos ejecutando procesos diferentes y algunos muy pesados, la sobrecarga del servidor es notable.


La ventaja de lenguajes como PHP es que permiten crear cadenas de texto de acuerdo al formato que se le envíe a funciones/métodos como date() o DateTime::format().  La desventaja vino después cuando un par de clientes se interesaron en la aplicación, pero clientes que no eran de aquí de Colombia, y sus zonas horarias afectaban de manera negativa la aplicación, ya que eventualmente tenía que detectar desde donde se conectaban y hacer los cálculos de la hora local del servidor, con respecto a la hora local de ellos y en algunos casos también calcular la hora local colombiana para mostrar algunos informes a mi jefe, y es ahí donde aparecía la desventaja por que debía estar utilizando cada rato la función date_default_timezone_set(), para determinar las zonas horarias de los clientes de países como panamá y chile, donde el horario cambia de acuerdo a la época de verano o invierno.


En el servidor que utilizo, no se puede utilizar el método DateTime::setTimeZone(), debe ser por la versión o el sistema operativo, realmente no había notado esto ya que al principio solo utilizaba procedimientos y funciones, y hasta ahora estoy haciendo una lenta transición al atrofiado modelo OOP que ofrece PHP.  Si lo acepto, es algo raro, pero aún así es uno de los más fáciles de utilizar.

Con respecto a las funciones que ya tenía en javascript, debía estarlas modificando cada rato y más en algunos informes que al parecer no funcionaban como se esperaba en países donde regía el horario de verano, y al descubrir esto hice las pruebas en local y con el servidor, lo que me demostró que efectivamente debía estar homologando esos datos casi a toda hora (o por lo menos cuando generan esos informes), ya fuera que lo guardara en la base de datos y al extraerlo lo convirtiera o lo cálculara siempre que el cliente ejecutaba los procesos.

Así que finalmente me cansé y decidí optar por una opción un poco más práctica aunque algo aparatosa, es decir, adoptar la capacidad de generar una cadena de texto de hora y fecha, de acuerdo al parámetro de formato que se le enviara a una función, así que basé la extensión que le hice al objeto 'Date' de javascript, en el estilo de formato que usa PHP.  La ventaja del objeto Date de Javascript es que actualmente la hora de casi todos los equipos (Linux, Mac, Windows) se sincroniza con la de internet de acuerdo a las configuraciones locales, y así puedo obtener incluso una versión 'minimalista' de la zona horaria, sin tener que hacer muchos cálculos.

No implementé todos los valores de formato aceptados en PHP, ya que no los necesito por ahora como en el caso del especificador 'u' (formato de microsegundos en PHP), por que ese nivel de precisión no es útil para mi actual aplicación, tal vez lo necesite después y si tenga que buscar el modo de sortear esa situación, pero afortunadamente ahora no es necesario.


Los formatos adaptados desde php fueron:

Día: d, D, l, N, w
Mes: F, m, M, n
Año: Y, L, y
Tiempo/hora: a, A, g, G, h, H, i, s
Zona horaria: O, P
Fecha/hora completa: c, U

Si quieren saber que significa cada uno de estos formatos pueden referirse al manual de la función date() en PHP.

En el caso de los pocos formatos que no se explican, ya que son propios de esta extensión, se encuentran:

k: Devuelve los milisegundos actuales, que van desde 000 a 999
C: Solo es un alias del método Date.toISOString();


El nuevo método getFormatDate, recibe 2 parámetros:

1. formattedString: La cadena de texto con el formato indicado utilizando los especificadores adaptados de PHP.

2. languageCode: Código de lenguage de 2 letras (en: English, es: español, fr: français, de: deutch), si no se especifíca se utiliza español por defecto.  Determina el idioma en que se imprimen los nombres de los días y los meses.

Faltan varios formatos, pero se irán agregando a medida que se necesiten, este código se puede extender y optimizar, o si uds hacen arreglos a esta extensión sería bueno que compartieran la mayor cantidad de mejoras posibles.  Una de las mayores extensiones que se le puede hacer es agregar más idiomas para la impresión de los nombres de los días y los meses.

Contenido:

1. DateExt.js:
Archivo que contiene la función getFormatDate, junto con algunos otros atributos y métodos necesarios para su funcionamiento.

2. prueba_fecha2.html:
Archivo de ejemplo.  Se puede notar que al final también estoy implementando un ejemplo de un reloj, como en la versión anterior de pruebas con el objeto Date (en facebook) que publiqué. 



La desventaja de este método, es que al llamar la función principal, esta siempre va a calcular y convertir todos los valores de los formatos, y por lo tanto generar un sobre uso de procesamiento que puede demorar otros procesos en nuestro sitio e incluso en el navegador, es decir, cuando se hace el llamado al método setConversionValues en la línea 56, donde se calculan todos los valores al cual serán convertidos los formatos respectivos de acuerdo a los valores de la fecha y hora enviados. 

Se recomienda utilizar esta extensión fuera de ciclos muy largos como en el caso de la función setInterval, claro que todo depende del equipo cliente.

Publicación relacionada en facebook

No hay comentarios:

Publicar un comentario