2012-03-06 25 views
9

Tengo una serie de fechas en formato ISO8601 y necesito ordenarlas. ¿Alguien tiene una sugerencia para un algoritmo que funcionaría? No creo que clasifiquen como cadenas a menos que esté muy equivocado, así que supongo que tienen que dividirse en sus partes componentes.Ordenar ISO 8601 fechas hacia adelante o hacia atrás

¿Alguien puede publicar un algoritmo, preferiblemente independiente del idioma, pero el ejemplo VB o C# funcionaría siempre que solo use cadenas y números enteros y no tenga funciones incorporadas al lenguaje.

Gracias!

Respuesta

20

Depende de si está mezclando formatos o no.

En cualquier formato específico, como yyyy-mm-dd o yyyy-Www-d, ISO 8601 está diseñado para ordenar lexicográficamente (que no sean años negativos).

Desde el ISO 8601 wikipedia page:

Fecha y hora valores se organizan desde la más a la menos significativa: año, mes (o semana), día, hora, minuto, segundo y fracción de segundo. El orden lexicográfico de la representación corresponde, por lo tanto, al orden cronológico, a excepción de las representaciones de fecha que implican años negativos. Esto permite que las fechas se clasifiquen de forma natural, por ejemplo, mediante sistemas de archivos.

Eso significa que la ordenación de las cuerdas debería funcionar bien.

Es solo si mix formatos no funcionarán. Si ese es el caso, deberá convertir a un formato específico antes de comparar. Por eso, me refiero a algo así como convertir todos los formatos en yyyy-mm-dd antes de comparar y luego volver luego si así lo desea.

Por ejemplo, si usted tiene los datos de entrada:

2010-03-01 
2010-W01-1 

que podría primero a todos ellos cambiará a:

2010-03-01:2010-03-01 
2010-01-04:2010-W01-1 

(anteponiendo los datos reales con una forma específica) a continuación, ordenar eso. Una vez que se haya ordenado, volverá y quitará todo hasta el primer carácter : en cada elemento, que recuperará el formulario original.

No necesariamente la manera más eficiente pero tendrá que hacer algo así si quiere conservar el formulario original. Si eso no es un problema, simplemente conviértelos a la forma específica una vez y déjalos así.

+0

Este es el formato de fecha: 2012-03-05 00: 30: 00.000 – alphablender

+0

@alphablender, esa no es una fecha, es una fecha/hora :-) Pero la teoría todavía se mantiene: conviértala a una forma común para que funcione la clasificación lexicográfica, oriéntala y luego conviértela de nuevo (si es necesario). Si _todas_ sus fechas ya son de esa forma, no necesita convertir nada en absoluto; la ordenación normal de cadenas funcionará bien. – paxdiablo

8

no creo que va a clasificar como cadenas a menos que esté muy equivocado,

Usted son :-) muy equivocado. Ordenarán como cadenas . Ese es uno de los principales puntos positivos de ISO 8601 en comparación con otros formatos de fecha.

Véase el punto 1: http://en.wikipedia.org/wiki/ISO_8601#General_principles

...El orden lexicográfico de la representación por lo tanto corresponde al orden cronológico ...

, siempre y cuando no se trata de años negativos, una que está utilizando la misma zona horaria y subformato es decir, no lo hace mes de mezcla basado y basado en semana (gracias a @paxdiablo y @whiskeysierra para señalar esto)

+2

Agradable por diseño, PERO sigue siendo mucho más lento que ordenar en unix epoch millis o sec si tiene muchas fechas –

+0

Las zonas horarias también podrían atornillar la orden, ¿verdad? – whiskeysierra

+0

@whiskeysierra Buen punto. – rjmunro

Cuestiones relacionadas