Fechas en JavaScript

Trabajo con fechas y detalles importantes en JavaScript

  1. Conceptos basicos sobre el manejo del tiempo en informatica.
  • epoch – desde que fecha SO cuenta tiempo.
  • En Windows tiempo se mide en 10.000 ticks del procesador = 1 milisegundo.
  • .NET epoch 01.01.0001, SQL Server 01.01.1753, etc.
  • Ordenadores trabajan con numeros, no con fechas.
    2+2.1. La clase Date.
  • Diferencia entre fechas en milisegundos. Epoch 1/1/1970 a las 00:00:00 horas.
  • Al crear “new Date()” tendremos fecha actual.
  • .toLocaleDateString() convierte fecha en un string, aplicando formato de fecha local corta (ej: dd/MM/yyyy)
  • .toLocalTimeString() convierte en hora en un string, aplicando formato de hora local.
  • “new Date(0)” obtenemos fecha de referencia (epoch).
  • “new Date(1972,4,23)”. Creamos fecha 23 de mayo de 1972. IMPORTANTE, meses cuentan desde 0.
  • “new Date(72,4,22,21,0,0)”. Creamos fecha 22 de mayo de 1972 21:00:00. IMPORTANTE, meses cuentan desde 0, anyos de 2 caracteres representan 19XX.
  • Si en fecha ponemos valor mas que toca, lo suma a la fecha. “new Date(1972, 13, 10)” sera 10 de febrero del 1973, porque tiene exceso en el mes (+2). Podemos asi sumer dias, meses y anyos. Tambien podemos tener restar determinados elementos, ej: new Date(1972,2,-10) sera 20 de febrero 1972.
  • “new Date(“Feb 12, 2015 20:15:37 GMT+2″)” sera 12/02/2015 22:15:37.
  • Comprobar si es fecha: return (valor instanceof Date).
    2.2. TRUCO: Número de días de un mes cualquiera.
  • Pasar en parametro 0 en dia. Ej.: “new Date(anyo, mes+1, 0)”. Nos devolvera numero de ultimo dia del mes indicado. new Date(2012,2,0) sera 29 de febrero 2012. Acordar que 2 representa tercer mes del año.
    2.3. Las partes del tiempo.
  • getTime: obtiene solamente la parte correspondiente a la hora, rechazando la fecha. Devuelve el número de segundos transcurridos desde el 1/1/ 1970. Es útil para crear marcas de tiempo para ciertas aplicaciones especiales de comunicación con el servidor.
  • getDay: nos dice el día de la semana en el que nos encontramos, empezando a contar en domingo, que sería el día 0. De este modo el lunes sería el 1, el – martes el 2 y así sucesivamente.
  • getDate: obtiene el día del mes dentro de la fecha dada.
  • getMonth: devuelve el número correspondiente al mes contenido en el objeto Date. Se comienza a contar en 0, que correspondería al mes de Enero.
  • getYear: devuelve el año contenido en la variable de tipo fecha. Esta función tiene un comportamiento algo extraño puesto que devuelve 2 cifras para años – anteriores al 2000, y 3 cifras para años posteriores al 2000. Es decir, empieza a contar los años en el 1900. Así, para el año 1980 devolverá 80, para 2016 – devolverá 116 y para 1897 será el año -3 (negativo). Su uso no está recomendado y se prefiere la el método siguiente que es consistente en lo que devuelve.
  • getFullYear: funciona igual que el anterior, pero en este caso el año se devuelve siempre con las cuatro cifras correspondientes. Debemos usarlo – generalmente en sustitución de getYear, que se considera obsoleta.
  • getHours: permite obtener el valor de la hora en una variable Date, sin incluir la fecha actual, ni los minutos ni los segundos.
  • getMinutes: con este método conseguimos averiguar los minutos de la hora indicada.
  • getSeconds: permite obtener la parte correspondiente a los segundos en una variable de hora.
  • getMilliseconds: facilita el número de milisegundos después del segundo actual que está especificado dentro de una variable de tipo Date. Es decir, aunque la hora actual se muestre redondeada a 19:22:37, internamente hay unos cuantos milisegundos de precisión más que podemos obtener, por lo que sería por ejemplo 19:22:37:849 (siendo 849 los milisegundos a mayores que devolverá esta función).
    2.4. Formatos personalizados.
  • En formato español: return fecha.getDate() + “/” + fecha.getMonth() + “/” + fecha.getFullYear();
    2.5. Zonas y diferencias horarias.
  • Universal Coordinated Time, UTC o GMT (o Greenwich Meridian Time, hora en el meridiano de Greenwich). El UTC es mas preciso, pero se cree que UTC y GMT es lo mismo.
  • getUTCDay
  • getUTCDate
  • getUTCMonth
  • getUTCFullYear
  • getUTCHours
  • getUTCMinutes
  • getUTCSeconds
  • getUTCMilliseconds
  • Obtener la zona horaria actual: getTimezoneOffset. Indica horas de diferencia ente hora local y hora UTC. Diferencia horaria no son horas completas.
    2.6. Métodos de modificación de fechas:
  • setDate: Permite asignar un nuevo día del mes a la fecha contenida en una variable.
  • setMonth: Asigna un nuevo valor para el mes en la fecha contenida en la variable. Recuerda que los meses empiezan a contar desde 0 para enero.
  • setYear: Permite cambiar el valor del año en una fecha. Si se usan sólo dos dígitos como argumento se considerará un año dentro del rango 1900-2000.
  • setFullYear: idéntico al método anterior pero se deben especificar siempre los cuatro dígitos del año. Es más recomendable que la anterior. Este método permite especificar opcionalmente el mes y el día del mes como segundo y tercer parámetro respectivamente.
  • setTime: permite asignar una nueva hora pasando como argumento el número de milisegundos transcurridos desde la medianoche del 1/1/1970. No se utiliza demasiado por razones obvias.
  • setMilliSeconds: fija el número de milisegundos que pasan del segundo en la hora actual de una variable.
  • setSeconds: permite fijar el número de segundos actuales en la variable. Opcionalmente se pueden especificar también los milisegundos como segundo parámetro.
  • setMinutes: fija los minutos actuales en la hora contenida en una variable. Tiene como parámetros opcionales el número de segundos y el de milisegundos transcurridos.
  • setHours: nos permite fijar la hora actual para una variable tipo Date. Tiene como tres parámetros opcionales los minutos, segundos y milisegundos.
    O en UTC:
  • setUTCDate
  • setUTCMonth
  • setUTCFullYear
  • setUTCMilliSeconds
  • setUTCSeconds
  • setUTCMinutes
  • setUTCHours
    2.7. Operaciones con fechas
  • Comparaciones basicas: date1>date2, date2>=date1, date1==date2 (compara objetos, normalmente devuelve false, mejor usar ===).
  • Uso de “+” para fechas suma fechas en formato string.
  • Uso de “*” no aporta nada.
  • Uso de “-” da diferencias en milisegundos, muy util y funciona bien.
  • Saber diferencia en dias: difDias = diferenciaEnMilisegundos / (24 * 60 * 60 * 1000).
  • Saber diferencia en meses: difDias = diferenciaEnMilisegundos / (30 * 24 * 60 * 60 * 1000).
  • Obtener numero de milisegundos: Date.parse(fechaBase).
  • Sumar 5 dias a fecha: base.setDate(base.getDate() + 5). Luego para representar en fecha: new Date(base.setDate(base.getDate() + 5)).
  • Sumar 13 segundos a fecha: base.setSeconds(base.getSeconds() + 13). Luego para representar en fecha: new Date(base.setSeconds(base.getSeconds() + 13)).
  1. Temporizadores y cronómetros
  • Para ejecutar codigo a intervalos regulares de tiempo.
  • Los timeouts ejecutan codigo 1 vez.
  • Los interval ejecutan codigo varias veces cada X.
    Formato: tempID = setTimeout(“Rutina”, Tiempo); “Rutina” – (opcion 1) nombre de un procedimiento o función a ejecutar, Tiempo – valor en milésimas de segundo. (opcion 2) Rutina tambien puede ser cadena a ejecutar “alert(‘Hola’)” (se considera como mala practica). (opcion 3) Función anonima con codigo a ejecutar.
  • setTimeout: anota valor de tiempo y devuelve referencia al temporizador. Ej: var miId = setTimeout(“miFuncion()”, 2000);
  • clearTimeout: para cancelar antes de que se ejecuta. Ej: clearTimeout(miId);
  • setInterval: definir cada cuanto ejecutar una función. Ej: id = setInterval(“Mifuncion()”, 2000);
  • clearInterval: parar un interval para que no se ejecuta mas. Ej: clearInterval(id);
    A los “set..” podemos pasar todos parametros que queremos: setTimeout(Mifuncion, 2000, parametro1, parametro2…);
    Estos metodos no son de JavaScript, sino del navegador. En NodeJS los volvieron a implementar.
    3.1. La precisión de los intervalos de tiempo.
    Intentar evitar valores muy pequeños. Mejor por encima de 100 milisegundos.
    JavaScript solamente posee un hilo de ejecución (excluyendo web workers de HTML).
    setTimeOut y setInterval ejecutan en mismo hilo.
    Si proceso dura mas que tiempo entre intervalos se iran metiendo en cola para ejecutarse. Y en cola puede haber solo una tarea de cada tipo, resto se descartan.
    Para asegurar que se ejecuta funcion despues de haberse ejecutado: function periodica() { setTimeOut(periodica, 100); }
    var divreloj = null; // variable global. En un timer buscaremos este div solo una vez, para luego aprovecharse de que ya lo tenemos y no tenemos que volver lo a buscar.