2008-09-04 5 views
5

Tengo una cadena que contiene la representación de una fecha. Parece que:¿Cómo crearía un patrón mediante programación desde una fecha almacenada en una cadena?

Jue Nov 30 de 19:00:00 EST 2006

Estoy intentando crear un objeto Date utilizando SimpleDateFormat y tiene 2 problemas.

1.) No puedo averiguar el patrón para codificar la solución al constructor SimpleDateFormat

2.) No puedo encontrar una manera de que pudiera analizar la cadena usando API para determinar el patrón así que podría reutilizar esto para diferentes patrones de salida de fecha

Si alguien conoce una solución que utiliza API o una solución personalizada, lo agradecería mucho.

+0

FYI, las viejas clases problemáticas de fecha y hora como ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html), y' java.text.SimpleTextFormat' son ahora [herencia ] (https://en.wikipedia.org/wiki/Legacy_system), suplantado por [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package- summary.html) classes. Consulte [Tutorial de Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Respuesta

7

El formato de pasar a SimpleDateFormat podrían ser la vista hacia http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy") 

En cuanto a su segunda pregunta, no sé de cualquier biblioteca de Java de averiguar un formato de fecha y analizarlo sin conocer de avanzar lo que es el formato.

2

no estoy seguro de que haya ninguna manera fácil de analizar una fecha y elaborar su patrón, pero yo habría pensado que el patrón para el que usted indicados serían:

AEE MMM DD HH: MM: ss zzz yyyy

+0

Gracias! Ese patrón funciona, lo mejor que pude encontrar usando google fue "ddd MMM dd hh: mm: ss 'EST' aaaa", que arrojaba una ParseException. Afortunadamente, también hay una forma de determinar el patrón mediante programación. – Aaron

0

¿Está pidiendo el patrón para esa fecha determinada? Si es así, creo que esto debería hacerlo:

"EEE MMM d HH:mm:ss z yyyy" 

O está tratando de tomar cualquier fecha con formato, e inferir el formato y analizarlo?

1

Como han dicho otros, el patrón parece que debería ser

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy" 

En cuanto a analizar un formato de fecha arbitraria, no estoy al tanto de cualquier biblioteca que hace esto en Java. Si quisieras desarrollar tal cosa, comenzaría por mirar la función perl str2time.

2

Si desea hacer otra cosa que analizarlo o formatearlo una fecha no hay mucho que hay para el manejo de los propios patrones de nada. Hace algún tiempo estaba escribiendo un componente Swing para ingresar fechas en un campo de texto formateado. Proporcionó un patrón y movió el cursor de entrada de texto a través de los elementos de ese patrón, solo permitiendo valores válidos.

Como parte de eso escribí un DateFormatParser available here as part of the OpenHarmonise open source project.

Analizar una fecha en un patrón sería un problema extremadamente interesante de abordar. Tendría que hacer ciertas suposiciones (por ejemplo, el uso de: en el tiempo, no en la fecha), pero enfrentaría los problemas eternos de los arreglos de dos dígitos y día/mes o mes/día.

0

Esto no es realmente lo mismo, pero es posible que desee ver algo como JChronic, que puede hacer el procesamiento del lenguaje natural en fechas. Por lo tanto, la fecha de entrada podría ser algo así como "mañana" o "dos semanas a partir del próximo martes".

Esto puede no ser de ninguna ayuda para su aplicación, pero, de nuevo, podría ser.

1

Debo decir que encuentro la otra pregunta muy interesante. Sin embargo, hay un problema grave: analice esto: 08/07/06. Si te limitas en un subconjunto de formatos esperados, probablemente puedas resolver el problema jugando con expresiones regulares, podrías crear un montón de patrones esperados, y luego romper cadenas en espacios o lo que sea, y unir parte por parte.

+0

Estoy de acuerdo en que definitivamente hay ambigüedades: este es el problema más común con las fechas. Sin embargo, una solución podría ser pasar el método programático a un patrón predeterminado como mm-dd-yy para que asuma en caso de que encuentre una fecha ambigua.Si no se proporciona ningún valor predeterminado (nulo) para ese parámetro, podría provocar un error lanzando una excepción, etc. Esta no es una solución perfecta, pero sería lo suficientemente razonable como para usarla en la mayoría de las situaciones. – Aaron

2

Vale la pena saber que el formato de fecha que ha dado no es arbitrario. Es el resultado del método Date.toString() incorporado (al menos en las configuraciones regionales de Reino Unido y EE. UU.). No por casualidad, también es el formato del comando 'fecha' de unix (al menos en Linux, y creo en otras implementaciones también), aunque para ser pedante, Date.toString() rellena números de un día con un cero mientras la fecha de Unix no.

Lo que esto significa es que es probable que reciba este formato de entrada cuando imprima una fecha no formateada en un campo modificable por el usuario (por ejemplo, un campo ENTRADA HTML) y la reciba sin modificar. De modo que el hecho de que los datos ingresen en este formato no significa que los usuarios ingresen otros mil formatos arbitrarios.

Por supuesto, todavía podrían. La forma en que manejo las entradas de fecha en general es con un montón de bloques try/catch, donde lo intento con un formato, luego con otro y luego con otro. Nuestro marco estándar ahora tiene hasta 20 formatos diferentes por defecto. Por supuesto, todavía no es perfecto; El otro día encontré a alguien que ingresó "03 Sept" como la fecha (una abreviatura de un mes no estándar y sin año) y no habíamos manejado ese escenario.

2

Véase Apache Commons 'DateUtils. Hay un método parseDate que toma su String y varios patrones para intentar y escupe una instancia Date.

3

El analizador de fecha POJava org.pojava.datetime.DateTime es un analizador inmutable y robusto que admite varios idiomas, zonas horarias y formatos.

Lo mejor de todo es que el analizador es heurístico y no requiere un "formato" preexistente para funcionar. ¡Simplemente pásale una cadena de texto de fecha/fecha y saca un java.util.Date!

Cuestiones relacionadas