Distinguir y analizar fechas en Java

Sé que este tema no es nuevo, aunque tengo que desenterrarlo nuevamente. Ya busqué en la web varias veces (incluidos algunos subprocesos aquí en stackoverflow) pero no he encontrado una respuesta satisfactoria hasta ahora.

(Entre otros, verifiqué Analizar fechas ambiguas en Java y http://www.coderanch.com/t/375367/java/java/Handling-Multiple-Date-Formats-Elegantly

Actualmente estoy escribiendo un Dateparser en Java, que toma una fecha y genera una cadena de formato que SimpleDateFormat puede usar para analizar la fecha.

Las fechas se analizan a través de expresiones regulares (sí, es una fea xD) de Logfiles (IBM Websphere, Tomcat, Microsoft Exchange, ...). Debido a que tenemos clientes en (al menos 2) configuraciones regionales diferentes, no hay manera de simplemente "lanzar" la cadena contra el método de análisis de SimpleDateFormat y esperar que funcione correctamente.

Además, existe el problema con la posición de día y mes (es decir, formatos "dd / MM / aaaa" o "MM / dd / aaaa") que no se puede resolver si no tengo al menos dos conjuntos de datos donde el día- el dígito ha cambiado ...

Entonces, mi enfoque actual sería almacenar los formatos de fecha para un software específico instalado en los sistemas de un cliente específico en una base de datos (mysql / xml / ...) y obligar al usuario a especificar al menos el nombre del cliente y el nombre del software para que haya suficiente contexto para desglosar la cantidad de posibilidades en que se puede dar el formato.

Este "subconjunto" se usaría para intentar analizar los archivos de registro del software especificado. (El subconjunto se almacena en un HashMap en un HashMap en la forma HashMap> map; La clave de enteros es la longitud de la cadena de formato y la clave de cadena del segundo Hashmap especifica una firma de fecha que solo contiene los caracteres de separación. ::. "para una fecha con formato" dd.MM.aaaa 11: 11: 11.111 ")

También tengo en cuenta el valor de los dígitos, es decir, un dígito> 12 tiene que ser un día porque no hay 13 meses. Pero esto solo funciona de manera confiable para Date-Strings después del 12 de un mes.

¿Hay alguna posibilidad de evitar la implementación de conocimientos previos sobre el entorno del que proviene el archivo de registro, lo que permite al analizador analizar de manera confiable una fecha sin tener que referir una segunda cadena de fechas para comparar?

Estoy atrapado en eso por casi 3 meses ahora.

Cualquier sugerencia sería muy bienvenida =)

Editar:

Bien chicos, este hilo se puede cerrar. Ahora se me ocurrió una solución diferente para mi problema específico. Para aquellos que estén interesados: estoy escribiendo un Logreader en Java. Como tenemos mantenimiento regular, tengo que leer muchos archivos de registro. Pero no es solo la información de texto sin formato que se escribe en el archivo. Imagine un servidor que acaba de fallar, es domingo por la noche y la siguiente persona en notarlo es el jefe del departamento de TI del cliente. Luego, al día siguiente, tengo que realizar tareas de mantenimiento y verificar los archivos de registro. A juzgar por el contenido, todo parecía estar bien, nada inusual. Media hora después de enviar el informe de mantenimiento, recibo un correo electrónico con el jefe mencionado anteriormente dnt rant, que el servidor se había bloqueado y parecía pasar desapercibido.

El punto es que no puede realizar un seguimiento del contenido y las marcas de tiempo de los archivos de registro con varios miles de líneas. Así que desarrollé un componente que lee un archivo de registro y calcula el tiempo entre dos entradas de registro diferentes. Cada logline se analizó en un java.util.Date para luego obtener la fecha como marca de tiempo para una alta resolución con respecto a los intervalos de registro. Las diferencias que luego arrojé a un gráfico de líneas, lo que hace que los tiempos de espera más largos entre dos loglines sean visibles como un gran pico relacionado con el resto del archivo.

Mi solución ahora será descartar por completo la mitad de la fecha de la cadena e insertar una fecha ficticia con un formato predefinido. La fecha solo tiene que cambiar si la Hora y los minutos se acercan a las 23:59. La fecha original más adelante se presenta en el gráfico con los "datos falsos" debajo.

Les agradezco a todos por sus sugerencias y comentarios =) (Y espero que mi inglés haya sido comprensible hasta ahora;))

Respuesta 1

Mi sugerencia es almacenar todas las fechas como 'ambiguas' hasta el momento en que se pueda resolver la ambigüedad. (Esto supone que un cliente en particular siempre proporcionará datos en el mismo formato). Tan pronto como obtenga un registro de un cliente para el que pueda identificar inequívocamente el formato de fecha, podrá aplicar este formato retrospectivamente a archivos anteriores .

Para hacer esto, necesitaría una tabla que asigne a cada cliente a su formato de fecha con algún marcador (por ejemplo, NULL) para indicar que el formato aún no está establecido. Probablemente también necesite crear su propia representación de fecha para poder modelar estas fechas ambiguas.

Entonces, como ejemplo, si los posibles formatos de fecha son:

dd/mm/yyyy
mm/dd/yyyy
yyyy/mm/dd
yyyy/dd/mm

Dadas las fechas, siempre debe poder identificar el año (permitir años de dos dígitos dificultaría considerablemente este problema). Por lo tanto, debería poder asignar fechas de la siguiente manera:

25/01/2011 -> UNAMBIGUOUS_DD_MM_YYYY
12/01/2011 -> AMBIGUOUS_XX_XX_YYYY
2011/03/03 -> AMBIGUOUS_YYYY_XX_XX
03/30/2011 -> UNAMBIGUOUS_MM_DD_YYYY
Respuesta: 2

Si es posible, puede pedir a los clientes que pasen la cadena de formato de fecha también junto con sus cadenas de fecha reales.

es decir, en sus archivos de registro, tendrían que tener una columna más

....., '03 / 11/2011 ',' MM / DD / AAAA ', ...

Respuesta: 3

Actualmente estoy buscando una biblioteca de Java (o una biblioteca nativa con una API de Java) para analizar y evaluar fórmulas. Utilizando las recomendaciones de aquí, eché un vistazo a muchas bibliotecas: JFormula JEval ...

Tengo la siguiente interfaz: public interface ClusterPopulation {public double computeDistance (ClusterPopulation other); } ¿Es posible especificar dentro de la interfaz misma, que ...

No puedo obtener el nombre del grupo bajo el cual se almacena el contacto. Puedo saber si se agrega en cualquier grupo como valor booleano (IN_VISIBLE_GROUP). No tengo idea de cómo obtener el nombre o id del grupo. ...

Después de una actualización de Hibernate 3 a 4, estamos trabajando en algunos problemas que aparecieron en el camino. Uno que nos tiene particularmente perplejos es una UnsupportedOperationException, donde un ...