jueves, 23 de junio de 2011

Comparacion entre 2 fechas

Comparar 2 fechas, para determinar cual es mayor, puede ser sencillo, sobre todo, si con lo que trabajas soporta el concepto de fecha y/o tiempo, por ejemplo: java.util.Date en java o System.DateTime en C#, que son lenguajes de programacion o incluso en hojas de datos, tipo Microsoft Excel o LibreOffice Calc.

El problema, se presenta, cuando es necesario trabajar con lenguajes que no conocen el concepto, como los shells de unix o cuando se almacenan archivos que contienen la fecha en el nombre del mismo.

En este punto la abstraccion de la fecha y la forma en como se representa, suele tomar un papel importante, dado que puede resolver completamente el problema, si se emplea el formato correcto.

Formas comunes de representar una fecha son: dia/mes/año en mexico o mes/dia/año en EEUU. Para nombres de archivos se suelen substituir las diagonales, por guiones, asi como el uso del nombre del mes y no el numero de mes. Por ejemplo:
  • Jun/27/2011
  • Oct/21/2011
  • Jul/1/2011
  • Oct/24/2005
  • Jul/4/2011
Si se ordena alfabeticamente, se obtiene lo siguiente:
  • Jul/1/2011
  • Jul/4/2011
  • Jun/27/2011
  • Oct/21/2011
  • Oct/24/2005
Lo cual no es lo que se requiere, sin embargo, si se reacomoda la fecha utilizando el orden año, mes, dia:
  • 2011/Jun/27
  • 2011/Oct/21
  • 2011/Jul/1
  • 2005/Oct/24
  • 2011/Jul/4
Al ordenar se obtiene lo siguiente:
  • 2005/Oct/24
  • 2011/Jul/1
  • 2011/Jul/4
  • 2011/Jun/27
  • 2011/Oct/21
El problema con el que nos encontramos es que la l esta antes que la n, en orden alfabetico, para sortear este inconveniente, en vez del nombre del mes, utilizamos el numero del mes:

  • 2011/6/27
  • 2011/10/21
  • 2011/7/1
  • 2005/10/24
  • 2011/7/4 
Al ordenar, obtenemos lo siguiente:

  • 2005/10/24
  • 2011/6/27
  • 2011/10/1
  • 2011/7/1
  • 2011/7/4
 Este resultado tampoco es correcto, esto es debido a que la longitud de los meses, es variable, por lo que, agregamos un 0 a la izquierda, cuando el mes esta formado por un solo digito (es recomendable tambien hacerlo para los dias)

  • 2011/06/27
  • 2011/10/21
  • 2011/07/01
  • 2005/10/24
  • 2011/07/04 
Al ordenar, obtenemos lo siguiente:

  • 2005/10/24
  • 2011/06/27
  • 2011/07/01
  • 2011/07/04
  • 2011/10/01
Que es finalmente lo que se requiere.

Esto, se puede aplicar a la creacion de nombres de archivos, por ejemplo, para poder ordenarlos por una fecha en particular, sobre todo cuando la fecha de creacion, es incorrecta (cuando son enviados por correo electronico y se pierde la fecha de creacion del archivo), por ejemplo los siguientes nombres de archivos seran ordenados correctamente por el sistema operativo al momento de listarlos (esto tanto en windows, linux o mac os)
  • reporte_2011-06-27.txt
  • reporte_2011-10-21.txt
  • reporte_2011-07-01.txt
  • reporte_2005-10-24.txt
  • reporte_2011-07-04.txt
 Al ser listados, se obtiene lo siguiente:
  • reporte_2005-10-24.txt
  • reporte_2011-06-27.txt
  • reporte_2011-07-01.txt
  • reporte_2011-07-04.txt
  • reporte_2011-10-21.txt
En unix, incluso, es posible emplear las fechas en este formato, con el comando expr, el cual puede comparar dos cadenas y determinar cual es mayor o menor.