DanLevy.net

Quiz: 14 preguntas sobre JavaScript Date

¡Aprende a impresionar en fiestas con curiosidades de JS! ✨

Hero image for Quiz: 14 preguntas sobre JavaScript Date

¿Qué tan bien conoces la clase Date?

Resumen

La clase Date en JavaScript tiene una API famosamente difícil. Fue heredada de Java y solo puedo asumir que se inspiró en métodos de cronometría neolíticos.

La lucha por dominar Date lleva a muchos desarrolladores a usar librerías de terceros sin cuestionarlo. Aunque suelen ser una opción segura y confiable, ¡estas librerías rara vez son necesarias para formatear fechas o localización!

Este cuestionario está diseñado para poner a prueba (y profundizar) tu conocimiento de la API nativa de Date. ¡Usa los botones verdes para obtener pistas y explicaciones! Con suerte, al final del desafío habrás consolidado tu comprensión de las fechas en JavaScript.

NOTA: Todos los ejemplos asumen la zona horaria local GMT-7.

👇 14 preguntas a continuación 👇


¿Qué incluirá la salida?

const d1 = new Date(2020, 1, 1)
console.log(d1)

El argumento del mes (Month) empieza en cero, con un rango de 0 a 11 (usando calendarios occidentales).

‘February’ tiene un valor de índice de uno. (Piénsalo como si fuera la búsqueda en un array).

¿Qué incluirá la salida?

const d2 = new Date(2020, 0, 1)
console.log(d2)

El argumento del mes (Month) empieza en cero. Tiene un rango de 0-11 (usando calendarios occidentales).

‘January’ tiene un valor de índice de cero. (Piénsalo como si fuera la búsqueda en un array).

¿Qué incluirá la salida?

const d3 = Date('Thu, 01 Jan 1970 00:00:00 GMT')
console.log(d3)

¡No olvides la palabra clave new! Date es una clase y debe llamarse con new.

Date('...') sin new ignora lo que le pases. Parece producir siempre la fecha y hora actuales, de forma similar a new Date() (sin argumentos).

Este es un error común que es fácil de pasar por alto, incluso en una revisión de código.

¿Qué incluirá la salida?

const date = new Date(2020)
console.log(date.getFullYear())

Una instancia de Date creada con un único argumento entero se interpreta como un valor Unix Epoch. El Epoch es un conteo de milisegundos desde el 1 de enero de 1970.

Un valor de 2020 (milisegundos) se traduce a 2 segundos después del 1 de enero de 1970.

Dado que nuestra zona horaria local tiene un desplazamiento negativo de -7 horas, terminamos con Wed Dec 31 1969 17:00:02 GMT-0700 (Mountain Standard Time).

Puedes evitar el desplazamiento de la zona horaria local utilizando .getUTCFullYear().

¿Qué valor se imprimirá en la consola?

const d1 = new Date('2020-01-01')
const d2 = new Date('2020-01-01T00:00')
console.log(d1.getFullYear(), d2.getFullYear())

La cadena sin un valor de tiempo T puede parecer el 1 de enero de 2020, pero las cadenas que solo contienen la fecha se interpretan como UTC. Al ajustarlas a nuestra zona horaria local (por ejemplo, GMT-7), descubrimos que todavía estamos en 2019.

Las cadenas de fecha y hora sin una zona horaria explícita se interpretan en la hora local.

El formato T00:00 hace que el segundo valor se interprete como la medianoche local.

La primera fecha se interpreta como Tue Dec 31 2019 17:00:00 GMT-0700 (Mountain Standard Time). La segunda fecha se interpreta como Wed Jan 01 2020 00:00:00 GMT-0700 (Mountain Standard Time).

Selecciona un método de formateo incorrecto:

¡El método toLocaleFormat() no es estándar! Puede que te resulte familiar porque proviene de una antigua librería de terceros.

Echa un vistazo a la documentación de toLocaleDateString. Su comportamiento está documentado bajo Intl.DateTimeFormat.

¿Qué incluirá la salida?

var date = Date.UTC('2020-01-02T00:00')
console.log(date.toUTCString())

Obtendrás TypeError: date.toUTCString is not a function, ya que Date.UTC() devuelve un entero en milisegundos, no una instancia de fecha.

¿Qué incluirá la salida?

const d = Date.UTC(2020, 0, 1)
console.log(d)

El método auxiliar Date.UTC no devuelve una instancia de fecha. Devuelve un número entero que representa los milisegundos.

¿Qué incluirá la salida?

// Assume local TZ is -07:00
const d = new Date(Date.UTC(2020, 0, 1))
console.log(d.getTimezoneOffset())

Las fechas se presentarán implícitamente en la hora local, con un .getTimezoneOffset() que (efectivamente) no cambia.

Las instancias de Date no almacenan datos de la zona horaria. Almacenan el número de milisegundos desde la Época Unix (1 de enero de 1970). La zona horaria se tiene en cuenta al analizar y renderizar cadenas de fecha. El comportamiento de visualización predeterminado se determina automáticamente según la configuración regional del sistema o del navegador.

¿Qué incluirá la salida?

const d = new Date(2020, 0, 1)
d.setDate(1)
console.log(d)

El método .setDate() establece el día del mes, basándose en el mes actual de la instancia dada.

Si se proporciona un valor fuera del número de días disponibles, el valor del mes de la instancia de fecha se ajustará (por ejemplo, un setDate(32) en enero se calculará como el 1 de febrero).

¿Qué incluirá la salida?

const d = new Date(2020, 0, 1)
d.setMonth(1)
console.log(d)

El método .setMonth() establece el mes para la instancia de fecha proporcionada.

El argumento del mes empieza en cero, con un rango de 0-11 (usando calendarios occidentales).

¿Qué incluirá la salida?

const d = new Date(2020, 0, 1)
d.setMonth(12)
console.log(d)

El método .setMonth() establece el mes para la instancia de fecha proporcionada.

El argumento month se basa en cero, con 12 valores en el rango de 0-11 (usando calendarios occidentales).

Aquí vemos que el año se ajusta a 2021, porque setMonth(12) es 1 más que 11 (diciembre).

¿Qué incluirá la salida?

const d = new Date(2020, 0, 1)
d.setMonth(13)
console.log(d)

El método .setMonth() establece el mes para la instancia de fecha proporcionada.

El argumento del mes se basa en cero, con un rango de 0-11 (usando calendarios occidentales).

Aquí vemos que el mes y el año se ajustan a febrero de 2021, porque setMonth(13) es 2 más que 11 (diciembre).

¿Qué incluirá la salida?

const d = new Date(2020, 0, 1)
d.setMonth(-1)
console.log(d)

El método .setMonth() establece el mes para la instancia de fecha dada.

El argumento del mes empieza en cero, con un rango de 0-11 (usando calendarios occidentales).

Aquí vemos que el mes y el año retroceden a diciembre de 2019, porque setMonth(-1) es menor que 0 (enero).