2010-12-23 18 views
5

Deseo construir un formato de fecha que opcionalmente tendrá un argumento de tiempo.¿Cómo creo un DateFormat con un argumento de tiempo opcional?

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd [hh:mm]"); 

¿Es también posible construir un formato de objeto fecha que es capaz de analizar diferentes formatos? Tal como probar la configuración regional actual, pero luego recurrir a ISO-8601 o debería simplemente escribir varios formatos de fecha si uno falla?

ACTUALIZACIÓN: Mirando hacia atrás a esta pregunta Puedo ver que no especificó que el motivo de múltiples formatos de fecha era para analizar cadenas, no para dar formato a una fecha, por lo tanto la ambigüedad para dar formato a los objetos de fecha no era una preocupación para mi. Si toma esto en cuenta, la porción de tiempo está o no incluida en la cadena de análisis sintáctico.

+1

No sé si hay una respuesta canónica, pero siempre puedes usar varios objetos de DateFormat, incluso una lista de ellos, y usar uno que no arroje una excepción ParseException. –

+1

Gracias, comencé a hacer eso usando 4 formatos diferentes, dos para la instancia predeterminada con/sin una y otra vez dos de los formatos ISO con/sin tiempo. Estoy pensando si debería probar la longitud de la secuencia para dar prioridad a los formatos de fecha + hora. –

+1

No se puede formatear una fecha de manera opcional con el tiempo porque todas las fechas tienen tiempo. ¿Cómo se mostraría opcionalmente? Puede analizar una fecha con muchos patrones, pero puede usar los DateUtils de apache common lang y pasar los patrones de análisis. – user364939

Respuesta

4

SimpleDateFormat no le permitirá hacer eso. No admite alternativas dentro de un formato (único).

Incluso si lo hiciera, habría un problema. Considere el uso de este

new SimpleDateFormat("yyyy-MM-dd [hh:mm]"); 

frente a la utilización

new SimpleDateFormat("yyyy-MM-dd hh:mm"); 
new SimpleDateFormat("yyyy-MM-dd "); 

En el primer caso, cuando analizaba la fecha contra el formato, no podría decir la diferencia entre "2010-01-01" y " 2010-01-01 00:00 "mirando el Date entregado a mí. En el segundo caso, puedo.

En el primer caso, cuando formato una fecha con cero en los campos de minutos y segundos, no está claro si el resultado debe terminar con "00:00" ... o no. En el segundo caso, esto está completamente en manos de la aplicación.

Supongo que lo que realmente estoy haciendo aquí es plantear el problema de que las fechas y la fecha/las horas significan cosas diferentes para diferentes personas y en diferentes contextos. A veces se refieren a instantes y, a veces, a intervalos. A veces, la falta de precisión expresa significa imprecisión y, a veces, la precisión está implícita.

Como desarrolladores tenemos que correr la línea entre escribir software que es molesto exigente, y el software que hace suposiciones incorrectas sobre lo que el usuario realmente entiende por un valor de fecha/hora. El primer paso para hacerlo bien para el usuario es comprender la complejidad del problema. La sobrecarga de variaciones en una cadena de formato único está (sería) arrasando con el problema debajo de la alfombra.

+0

Gracias Stephen, estoy de acuerdo con su razonamiento, sin embargo, si un formato está documentado para el usuario final, entonces no debería haber ninguna razón por la que no pueda seguir ese formato. El problema surge cuando se escribe una extensión para el software que una situación solo puede aceptar un único argumento por el cual ese argumento debe determinarse implícitamente en el tiempo de ejecución. –

+0

@Brett Ryan - * "... si un formato está documentado para el usuario final, entonces no debería haber ninguna razón por la que no pueda seguir ese formato" *. ¿Tus usuarios prestan atención a la documentación? Eres afortunado :-) –

Cuestiones relacionadas