Trabajar con fechas

facebook-svg gplus-svg twitter-svg

En el mundo hay decenas de zonas horarias. En JavaScript hay solo dos:

- La zona horaria local. O sea la zona horaria del usuario.
- UTC acrónimo de Coordinated Universal Time o Horario Universal Coordinado. En practica UTC es sinónimo de Greenwich Mean Time (GMT).

La mayoría de los métodos de Date devuelven el tiempo local. Si necesitamos utilizar el Horario Universal Coordinado (UTC) podemos utilizar Date.UTC() que  acepta exactamente como Date() un máximo de 7 argumentos (año, mes, día, hora, minuto, segundo, milisegundo).

new Date(Date.UTC(2019,7,23,10,32));// utilizando hasta 7 argumentos

El método new Date()

En JavaScript new Date() crea una nueva instancia de Date() que representa un momento dado en el tiempo.

La sintaxis:

Podemos crear una nueva instancia de Date:

1. Sin argumentos. En este caso devuelve el momento actual:

new Date(); 

2. Utilizando una marca de tiempo Unix (Unix Time Stamp) como argumento. 

new Date(1563890689898); 

Una marca de tiempo es un número integro que representa el numero de segundos que han pasado desde el 1 de enero del 1970.
Podemos conseguir la marca de tiempo del momento actual utilizando Date.now().

console.log(Date.now()); // 1563890689898

También podemos utilizar Date.parse() con una cadena de texto como argumento o con hasta 7 argumentos ( año, mes, día etc...)

Date.parse('1970-01-01');// devuelve 0
Date.parse(2019,04,1)// devuelve 1546300800000

3. Utilizando hasta 7 argumentos:

new Date (año, mes[, dia[, hora[, minuto[, segundo[, milisegundo]]]]]);

donde lo que aparece entre corchetes son parámetros opcionales.

  • - año: un número de 4 dígitos: 2019;
  • - mes: un número entre 0 y 11 donde 0 es para el mes de enero. En el ejemplo anterior 7 representa el mes de agosto.
  • - día: un número de 1 a 31; opcional; el valor por defecto es 1.
  • - hora: un número de 0 a 23; opcional; el valor por defecto es 0.
  • - minuto: un número de 0 a 59; opcional; el valor por defecto es 0.
  • - segundo: un número de 0 a 59; opcional; el valor por defecto es 0.
  • - milisegundo: un número de 0 a 999; opcional; el valor por defecto es 0.

Por ejemplo para el 23 de agosto de 2019 a las 10:32 podemos escribir:

new Date(2019,7,23,10,32)

También podemos utilizar esta sintaxis ( hasta 7 argumentos ) para conseguir la data en formato UTC:

new Date(Date.UTC(2019,7,23,10,32));

4. Utilizando una cadena de texto.

Crear una nueva instancia de Date utilizando una cadena de texto es probablemente menos utilizado en países de habla no inglesa. En este caso new Date() toma como único argumento una cadena de texto representando la fecha. La cadena de texto utilizada tiene un formato especial aceptado mundialmente: ISO8601

La sintaxis es la siguiente:

YYYY-MM-DDThh:mm:ss:sssZ

Donde:

  • - YYYY representa el año: un número de 4 digitos.
  • - guion - un delimitador
  • - MM el mes: uno o dos dígitos donde 01 o 1 es el mes de enero y 12 es el mes de diciembre.
  • - guion - un delimitador
  • - DD la data: uno o dos dígitos desde 1 o 01 a 31
  • - T es otro delimitador para indicar que de aquí en adelante la cadena de texto representa el tiempo ( hora, minuto etc...). Puede ser reemplazado por un espacio en blanco.
  • - hh la hora: uno o dos dígitos desde 0 a 23
  • - dos puntos : un delimitador
  • - mm el minuto: uno o dos dígitos entre 0 y 59
  • - dos puntos : un delimitador
  • - ss el segundo: uno o dos dígitos entre 0 y 59
  • - dos puntos : un delimitador
  • - sss milisegundos de uno a 3 dígitos entre 0 y 999
  • - Z si es presento al final de la cadena indica que la data es en formato UTC. De lo contrario la data utiliza la zona horaria local

Métodos de Date

Date.now()

Date.now() devuelve un valor numérico representando el momento actual (el número de segundos desde el 1 de enero de 1970, 00:00:00). Por ejemplo : 1555428987900.

let ahora = Date.now()
Date.UTC()

UTC es el acrónimo de Coordinated Universal Time ( o horario universal coordinado)

El método Date.UTC() acepta los mismos parámetros que Date y devuelve el número de segundos desde el 1 de enero de 1970, 00:00:00

let fecha = new Date(Date.UTC(2019, 3, 16, 3, 14, 08));// 1547655248000
Date.parse()

Date.parse() devuelve un integro representando el número de segundos desde el 1 de enero de 1970, 00:00:00

Date.parse('01 Jan 1970 00:00:00 GMT');// devuelve 0
Date.parse("2019-04-16")// devuelve 1555372800000

OJO: la documentación dice que no es recomendable utilizar Date.parse() ya que no es un método preciso y da lugar a diferencias e inconsistencias en varios navegadores.

Los objetos en JavaScript pueden tener métodos getter (devuelven un valor) y métodos setter (establecen un valor).

Algunos getters

Los getters devuelven el valor del día, hora, minuto etc. . . de la fecha.

Supongamos que tenemos la siguiente fecha:

let fecha = new Date("2019-04-16 17:14:08:05");
getFullYear()

El método getFullYear() devuelve un número de 4 dígitos representando el año

console.log(fecha.getFullYear())//en este caso devuelve 2019
getMonth()

El método getMonth() devuelve el mes como un número entre 0 y 11. En este caso devuelve 3 o sea el mes de abril.

console.log(fecha.getMonth())// 3 == abril (0-11)
getDate()

El método getDate() devuelve el día del mes y puede tener valores entre 1 y 31

console.log(fecha.getDate());//en este caso devuelve 16
getDay()

El método getDay() devuelve el día de la semana y puede tener valores entre 0 (domingo) y 6 ( sábado )

console.log(fecha.getDay())//en este caso devuelve 2  o sea martes
getHours()

El método getHours() devuelve la hora como un número entre 0 y 23. En este caso devuelve 17

console.log(fecha.getHours())//17 (0-23)
getMinutes()

El método getMinutes() devuelve los minutos como un número entre 0 y 59

console.log(fecha.getMinutes())//14 (0-59)
getSeconds()

El método getSeconds() devuelve los segundos como un número entre 0 y 59. En este caso devuelve 8.

console.log(fecha.getSeconds())// 8 (0-59)
getMilliseconds()

El método getMilliseconds() devuelve los milisegundos como un número entre 0 y 999

console.log(fecha.getMilliseconds())//5 (0-999)
getTime() y valueOf()

El método getTime() devuelve el numero de segundos pasados desde el 1 de enero de 1970, 00:00:00

console.log(new Date().getTime())//1555427648005

También podemos utilizar el método valueOf() con el mismo propósito:

console.log(new Date().valueOf ())//1555427648005
getTimezoneOffset()

El método getTimezoneOffset() devuelve la corrección del huso horario correspondiente en minutos para el tiempo local. En España la corrección del huso horario es -60, pero durante el horario de verano cambia a -120

console.log(fecha.getTimezoneOffset())//-120 

También hay otros tantos métodos que utilizan el horario universal coordinado:
getUTCDate(),getUTCDay(), getUTCHours() etc. . .

Algunos setters

Los setters establecen el valor del día, hora, minuto etc. . . de la fecha

Supongamos que tenemos la siguiente fecha:

let fecha = new Date("2019-04-16 17:14:08:05");
setFullYear()

Para cambiar el año del 2019 a 2020 podemos utilizar el método setFullYear()

fecha.setFullYear(2020);
setMonth()

Pare cambiar el mes podemos utilizar el método setMonth() que acepta valores de 0 a 11. Por ejemplo podemos cambiar el mes de abril (3) a diciembre (11)

fecha.setMonth(11);
setDate()

Para cambiar el día del mes  del 16 a 24 podemos utilizar el método setDate(). Acepta un valor entre 1 y 31

fecha.setDate(24);
setHours()

Para cambiar la hora de 17 a 18 podemos utilizar el método setHours(). Acepta un valor entre 0 y 23

fecha.setHours(18);
setMinutes()

Para cambiar los minutos de 14 a 25 podemos utilizar el método setMinutes()

fecha.setMinutes(25); Acepta valores de 0 a 59
setSeconds()

Para cambiar los segundos podemos utilizar el método setSeconds() que acepta valores de 0 a 59. Por ejemplo si en lugar de 08 segundos queremos que sean 39:

fecha.setSeconds(39);
setMilliseconds()

Para cambiar los milisegundos de 0 a 999 podemos utilizar el método setMilliseconds() Acepta un valor entre 0 y 999

fecha.setMilliseconds(999);

Exactamente como en el caso de los getters, hay otros tantos métodos que utilizan el horario universal coordinado: setUTCDate, setUTCHours() etc. . .

Otros métodos útiles

toString()

El método toString() devuelve el objeto Date como cadena de texto en Inglés de esta manera:

let evento = new Date(1993, 0, 25, 14, 39, 7);
console.log(evento.toString());//"Mon Jan 25 1993 14:39:07 GMT+0100 (Central European Standard Time)"

La cadena de texto devuelta contiene:

  • - los primeros tres letras del día de la semana (ejemplo: Mon de Monday para el lunes )
  • - un espacio
  • - los primeros tres letras del nombre del mes (ejemplo: Jan de January para el mes de enero )
  • - un espacio
  • - la data como un grupo de dos dígitos (25)
  • - un espacio
  • - un año como un grupo de cuatro dígitos (1993)
  • - un espacio
  • - la hora como un grupo de dos dígitos (14)
  • - dos puntos :
  • - el minuto como un grupo de dos dígitos (39)
  • - dos puntos :
  • - el segundo como un grupo de dos dígitos (07)
  • - un espacio
  • - la cadena de texto "GMT"
  • - + para desfases positivos o - para desfases negativos
  • - dos dígitos para el desfase de la hora (01)
  • - dos dígitos para el desfase de minutos(00)
  • - opcional la zona horaria: (Central European Standard Time)
toDateString()

El método toDateString() devuelve solo la data de un objeto Date().  Por ejemplo

let evento = new Date(1993, 0, 25, 14, 39, 7);
console.log(evento.toDateString());//"Mon Jan 25 1993"
toTimeString()

El método toTimeString() devuelve solo la hora del objeto Date().  Por ejemplo

let evento = new Date(1993, 0, 25, 14, 39, 7);
console.log(evento. toTimeString ());//"14:39:07 GMT+0100 (Central European Standard Time)"
toLocaleString()

El método toLocaleString() devuelve una cadena de texto en el idioma indicado, por ejemplo 'es-ES' o sea español de España.

let event = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));
let opciones = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
console.log(event.toLocaleString('es-ES', opciones));

Vea algunas propiedades del objeto opciones utilizado para los métodos locales.

toLocaleDateString()

Exactamente como el método toDateString() el método toLocaleDateString() devuelve la data de un objeto Date() esta vez en el idioma indicado, por ejemplo en español de España ('es-ES').

let opciones = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' };
let evento = new Date(1993, 0, 25, 14, 39, 7);
console.log(evento.toLocaleDateString('es-ES', opciones));// "lunes, 25 de enero de 1993"
toISOString()

El método toISOString() devuelve una cadena de texto simplificada en formato ISO ISO_8601

let evento = new Date(1993, 0, 25, 14, 39, 7);
console.log(evento.toISOString());//"1993-01-25T13:39:07.0
Algunas propiedades del objeto opciones utilizado para los métodos locales

Hay que utilizar uno de estos conjuntos de propiedades:

- weekday, year, month, day, hour, minute, second
- weekday, year, month, day
- year, month, day
- year, month
- month, day
- hour, minute, second
- hour, minute

weekday
El día de la semana. Posibles valores:
"long" o sea largo (ejemplo: lunes)
"short" o sea corto (ejemplo: lun.)
"narrow" o sea estrecho (ejemplo: L). Observación: para evitar confusiones con martes (M) miércoles devuelve X

era
La era. Posibles valores:
"long" o sea largo (ejemplo: después de Cristo)
"short" o sea corto (ejemplo: d. C.)
"narrow" o sea estrecho (en español devuelve de nuevo d. C.)

year
El año. Posibles valores:
"numeric" o sea numérico (ejemplo: 2019)
"2-digit" o sea dos dígitos (ejemplo:19)

month
El mes. Posibles valores:
"numeric" o sea numérico (ejemplo: 1)
"2-digit" o sea dos dígitos (ejemplo: 01)
"long" o sea largo (ejemplo: enero)
"short" o sea corto (ejemplo: ene.)
"narrow" o sea estrecho (ejemplo: E). OJO: tanto el mes de marzo como el mes de mayo devuelven M. Lo mismo pasa con los meses junio y julio que devuelven J o abril i agosto que devuelven A. 

day,
El día. Posibles valores:
"numeric" o sea numérico (ejemplo: 7)
"2-digit" o sea dos dígitos (ejemplo: 07)

hour,
La hora. Posibles valores:
"numeric" o sea numérico (ejemplo: 7)
"2-digit" o sea dos dígitos (ejemplo: 07)

minute,
El minuto. Posibles valores:
"numeric" o sea numérico (ejemplo: 7)
"2-digit" o sea dos dígitos (ejemplo: 07)

second
El segundo. Posibles valores:
"numeric" o sea numérico (ejemplo: 7)
"2-digit" o sea dos dígitos (ejemplo: 07)

timeZoneName
El nombre de la zona horaria. Posibles valores:
"long" o sea largo (ejemplo: hora de verano de Europa central)
"short" o sea corto (ejemplo: CEST)

El valor por defecto de todas estas propiedades es undefined pero para las propiedades weekday, year, month, day, hour, minute, second el valor undefined es interpretado como numeric.