¿Cómo crearía mediante programación un patrón a partir de una fecha almacenada en una cadena?

StackOverflow https://stackoverflow.com/questions/43842

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo una cadena que contiene la representación de una fecha.Parece que:

Jueves 30 de noviembre 19:00:00 EST 2006

Estoy intentando crear un objeto Fecha usando SimpleDateFormat y tengo 2 problemas.

1.) No puedo entender el patrón para codificar la solución en el constructor SimpleDateFormat

2.) No puedo encontrar una manera de analizar la cadena usando API para determinar el patrón y poder reutilizarlo para diferentes patrones de salida de fecha.

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

¿Fue útil?

Solución

Se puede consultar el formato para pasar a SimpleDateFormat 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 conozco ninguna biblioteca Java que pueda encontrar un formato de fecha y analizarlo sin saber de antemano cuál es el formato.

Otros consejos

El analizador de fechas POJava org.pojava.datetime.DateTime es un analizador robusto e inmutable que admite múltiples 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 le pasa una cadena de texto de fecha/fecha y hora y obtiene un java.util.Date!

No estoy seguro de que exista una manera fácil de analizar una fecha y determinar su patrón, pero habría pensado que el patrón para la que publicaste sería:

EEE MMM dd HH:mm:ss zzz aaaa

Si desea hacer algo más que analizar o formatear una fecha, no hay mucho disponible para manejar los patrones en sí.Hace algún tiempo estaba escribiendo un componente Swing para ingresar fechas en un campo de texto formateado.Usted proporcionó un patrón y movió el cursor de entrada de texto a través de los elementos de ese patrón, permitiendo solo valores válidos.

Como parte de eso escribí un DateFormatParser disponible aquí como parte del proyecto de código abierto OpenHarmonise.

Analizar una fecha en un patrón sería un problema extremadamente interesante de abordar.Tendría que hacer ciertas suposiciones (p. ej.uso de :en el tiempo, no en la fecha), pero enfrentaría los eternos problemas de los años de 2 dígitos y las disposiciones día/mes o mes/día.

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

Lo que esto significa es que es probable que reciba este formato de entrada cuando envíe una fecha sin formato a un campo modificable por el usuario (p. ej.un campo HTML INPUT) y recibirlo sin modificar.Entonces, el hecho de que la entrada venga en este formato no significa que los usuarios escribirán en mil otros formatos arbitrarios.

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

Ver Apache Commons' FechaUtils.Hay una parseDate método que lleva tu String y múltiples patrones para intentar escupir un Date instancia.

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

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

En cuanto a analizar una fecha de formato arbitrario, no conozco ninguna biblioteca que haga esto en Java.Si estuviera interesado en desarrollar algo así, comenzaría mirando el archivo Perl. str2time función.

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

¿Solo estás pidiendo el patrón para esa fecha determinada?Si es así, creo que esto debería funcionar:

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

¿O está intentando tomar cualquier fecha formateada, inferir el formato y analizarla?

Qué tal si:

EEE MMM dd HH:mm:ss zzz yyyy

Simplemente pase la cadena al constructor de SimpleDateFormat.Para usar el objeto, simplemente llame al método de análisis pasando la cadena que desea convertir en una fecha.

Podrías echarle un vistazo a:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

Esto no es realmente lo mismo, pero es posible que desees ver algo como Jcrónico, que puede realizar 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".

Es posible que esto no ayude en absoluto para su aplicación, pero, de nuevo, podría serlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top