Ordenar fechas en JavaScript

Hace unas semanas, recibí esta consulta en el curso iDESWEB:

Lo que si que me tiene mosca, es lo de ordenar las fechas, si lo haces con sort como los títulos y los países te ordena las fechas por días, entonces mirando los métodos de date vi parse que te devuelve el valor en milisegundos desde el 1 de enero del año 70 o algo así, lo probé en un documento a parte con dos fechas en el formato en el que tengo las fechas y me daba dos números diferentes ,con lo que lo puse en el documento HTML y me ordenaba bien los años, pero no entiendo bien porque las fechas del mismo año estaban desordenadas. Además cuando quite las alertas que me puse antes de cada función para asegurarme que se ejecutaban correctamente, no se porque ya no me lo ordena ni por años y eso que tire de control z y lo deje igual, pero debí de cambiar algo porque ahora no funciona y la consola de firefox no me marca errores de js. También en probado con valueOf y nada tampoco.

Y esta fue mi respuesta:

Hola.

La función sort() de JavaScript realiza un ordenación alfabética. Esa ordenación no sirve para ordenar fechas, porque una fecha escrita con el formato “dd/mm/aa” se tiene que ordenar de derecha a izquierda.

Para usar esa función en la ordenación de fechas puedes hacer dos cosas:

  • Puedes escribir la fecha en formato “aaaa-mm-dd”, que casualmente (no es casualidad, está hecho por esto mismo) es el formato que se emplea en las bases de datos para almacenar las fechas. De este modo, primero se ordena por el año, después por el mes y por último por el día. Lo que ocurre es que este formato es confuso para mucha gente: lo puedes usar internamente, pero no para mostrar una fecha al usuario.
  • Puedes suministrar a la función sort() una función de callback para realizar la comparación: esa función, que debes escribir, realiza la comparación de dos fechas.

Pasar la fecha al número de segundos o milisegundos podría ser una solución… pero no lo es, porque sort() realiza una ordenación alfabética, no numérica: tampoco sirve para ordenar números. Prueba lo siguiente:

var a = [2, 20, 19, 1, 10, 111, 200, 9, 99];
a.sort();

El resultado es:

[1, 10, 111, 19, 2, 20, 200, 9, 99]

¿Está ordenado?
Un saludo.

Profesor del Departamento de Lenguajes y Sistemas Informáticos de la Universidad de Alicante (España). Interesado en el desarrollo y la accesibilidad web.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.