2011-02-21 23 views
5

Me gustaría producir parciales de Strings, pero no puedo encontrar nada en la API que lo soporte. Obviamente, puedo escribir mi propio analizador fuera del marco de trabajo de Joda-Time y crear los parciales, pero no puedo imaginar que la API aún no tenga la capacidad de hacerlo.Analizando Joda-Time Partials

El uso de threeten (JSR-310) sería una solución aceptable, pero no parece ser compatible con los parciales. No sé si eso se debe a su estado alfa, o si el concepto parcial se maneja de una manera diferente, lo cual no he descubierto.

¿Cuál es la mejor manera de convertir un String (2011, 02/11, etc.) en un parcial?

Respuesta

2

He extendido DateTimeParserBucket. Mi clase extendida intercepta llamadas a los métodos saveField() y almacena el tipo y el valor del campo antes de delegar en super. También implementé un método que usa esos valores de campo almacenados para crear un Parcial.

Puedo pasar mi instancia de segmento a DateTimeParser.parseInto(), y luego solicitarle que cree el parcial.

Funciona, pero no puedo decir que estoy impresionado con Joda-Time, dado que no es compatible con el análisis Parciales de la caja. La falta de DateTimeFormatter.parsePartial (String) es una omisión flagrante.

+2

¿podría compartir su código? Tengo un caso de uso para esta funcionalidad y me encantaría una ventaja. – RubyTuesdayDONO

1

Debe comenzar por definir el formato válido para los Partials que va a aceptar. No hay clase que solo tome texto e infiera la mejor coincidencia posible para un parcial. Es demasiado subjetivo en función de la configuración regional, la preferencia del usuario, etc. Por lo tanto, no hay forma de evitar hacer una lista de todos los formatos válidos para la entrada. Será muy difícil hacer que estos sean mutuamente excluyentes, por lo que debe haber prioridades. Por ejemplo, es posible que desee mm/dd y mm/yy para que ambos sean formatos válidos. Si le doy la cadena 02/11, ¿cuál debería tener prioridad?

Una vez que haya determinado exactamente los formatos válidos, debe usar DateTimeFormat.forPattern para crear un DateTimeFormatter para cada uno. Luego puede usar cada formateador para intentar parseInto a MutableDateTime. Luego, revise cada campo en el MutableDateTime y transfiera el valor a Partial.

Desafortunadamente, no hay mejor manera de manejar esto en la biblioteca de Joda.

+0

De eso tenía miedo. No voy a escribir código para convertir DateTimes para cada formato en Partials. Incluso una clase que acepta la lista de campos y usa esa información para crear el formateador y luego realizar la conversión más tarde es demasiado pirateo. Si conoce una forma de extraer la lista de tipo de campo del formateador, entonces podría escribir un método aceptando el formateador y el DateTime, devolviendo el Parcial. De lo contrario, iré con mi solución de Bucket o me quedaré con mi código heredado. – user371320

+0

No veo dónde tienes otra opción. –

1

ISODateTimeFormat clase allows impresión parcial. Como dices, no hay un método de análisis en DateTimeFormatter (aunque puedes analizar un LocalDate e interpretar eso).

ThreeTen/JSR-310 tiene la clase DateTimeFields que reemplaza Partial. Se admite el análisis de parciales en un CalendricalMerger, sin embargo, es posible que aún no se pueda volver a incluir en un DateTimeFields.

+0

hay un problema abierto para esto: https://sourceforge.net/tracker/?func=detail&aid=3280815&group_id=97367&atid=617892 – RubyTuesdayDONO