¿Debo usar clases de fecha y hora de Java o ir con una biblioteca de terceros como Joda Time?


147

Estoy creando un sistema basado en la web que se utilizará en países de todo el mundo. Un tipo de datos que deben almacenarse son las fechas y horas.

¿Cuáles son los pros y los contras de usar las clases de fecha y hora de Java en comparación con las bibliotecas de terceros como Joda time ? Supongo que estas bibliotecas de terceros existen por una buena razón, pero nunca las he comparado realmente.


55
Para aclarar algunos comentarios ... Mientras Joda-Time continúa, su sucesor JSR 310: API de fecha y hora está programado para ser parte de Java 8 bajo el paquete java.time . Oracle tiene un borrador de un tutorial . JDBC 4.2 manejará los nuevos tipos de datos.
Basil Bourque

Respuestas:


197

EDITAR: Ahora que Java 8 ha sido lanzado, si puedes usar eso, ¡hazlo! java.timees incluso más limpio que Joda Time, en mi opinión. Sin embargo, si está atascado antes de Java-8, siga leyendo ...

Max preguntó por los pros y los contras de usar Joda ...

Pros:

  • Funciona muy bien. Sospecho firmemente que hay muchos menos errores en Joda que las bibliotecas estándar de Java. Algunos de los errores en las bibliotecas de Java son realmente difíciles (si no imposibles) de solucionar debido al diseño.
  • Está diseñado para alentarlo a pensar en el manejo de la fecha / hora de la manera correcta, separando el concepto de "hora local" (por ejemplo, "despiértame a las 7 am donde quiera que esté") y un instante en el tiempo ("Llamo a James a las 3 p.m. PST; puede que no sean las 3 p.m. donde está, pero es el mismo instante ")
  • Creo que hace que sea más fácil de actualizar la base de datos zona horaria, lo que hace el cambio con relativa frecuencia
  • Tiene una buena historia de inmutabilidad, lo que hace que la vida sea mucho más fácil para IME.
  • A partir de la inmutabilidad, todos los formateadores son seguros para subprocesos, lo cual es excelente porque casi siempre desea reutilizar un único formateador a través de la aplicación
  • Tendrás una ventaja inicial sobre el aprendizaje java.timeen Java 8, ya que son al menos algo similares

Contras:

  • Es otra API para aprender (aunque los documentos son bastante buenos)
  • Es otra biblioteca para construir y desplegar
  • Cuando usa Java 8, todavía hay algo de trabajo para migrar sus habilidades
  • He fallado en usar el DateTimeZoneBuilderefectivo en el pasado. Sin embargo, este es un caso de uso muy raro.

Para responder a la idea de oxbow_lakes de construir efectivamente su propia API pequeña, aquí están mis puntos de vista de por qué esta es una mala idea:

  • Es trabajo. ¿Por qué trabajar cuando ya está hecho para ti?
  • Es mucho más probable que un recién llegado a su equipo esté familiarizado con Joda que con su API local.
  • Es probable que se equivoque en algo más allá de los usos más simples ... e incluso si inicialmente piensa que solo necesita una funcionalidad simple, estas cosas tienen la costumbre de volverse más complicadas, un poquito a la vez. La manipulación de fecha y hora es difícil de hacer correctamente. Además, las API de Java integradas son difíciles de usar correctamente: solo observe las reglas sobre cómo funciona la aritmética de fecha / hora de la API de calendario. Construir algo sobre estos es una mala idea en lugar de utilizar una biblioteca bien diseñada para empezar.

55
@adi: Actualizado: sigue siendo válido, pero espero que JSR-310 sea parte de Java 8, pero no fue parte de Java 7.
Jon Skeet

2
@ JonSkeet Esto probablemente debería actualizarse desde la introducción de java-8
Sionnach733

@ Sionnach733: No voy a actualizarlo todo, pero agregaré algo al principio.
Jon Skeet

2
Hay un backport java.time.*para Java 6 y 7: threeten.org/threetenbp
Miscreant el

24

Bueno, a menos que tengas la intención de esperar a Java 8, esperando que implementen una mejor API para manipular la fecha y la hora, sí, por favor, usa Joda-Time . Es un ahorro de tiempo y evita muchos dolores de cabeza.


¿Pros y contras? Nunca he usado el tiempo de Joda, sería interesante escuchar lo que le gusta a la gente.
Max Stewart

15

La respuesta es: depende

JODA (y JSR-310) es una biblioteca de fecha / hora completamente funcional, que incluye soporte para su uso con múltiples sistemas de calendario.

Personalmente, descubrí que JODA está demasiado lejos en términos de complejidad para lo que necesito. Los 2 errores principales (en mi humilde opinión) en el Java estándar Datey las Calendarclases son:

  1. Son mutables
  2. Combinan el concepto de un año-mes-día de un instante en el tiempo

Aunque JODA aborda estos problemas, le resultará bastante fácil desarrollar sus propias clases YearMonthDayy Instant, que utilizan las clases de Java bajo el capó para los cálculos "calendáricos" reales. Entonces no tiene que familiarizarse con una API de> 100 clases, un mecanismo de formato / análisis diferente, etc.

Por supuesto, si necesita una representación completa de diferentes cronologías (por ejemplo, hebreo) o desea poder definir su propio sistema de calendario imaginario (por ejemplo, para un juego que está escribiendo), entonces tal vez JODA o JRS-310 sea para usted. Si no, entonces sugeriría que rodar el suyo es posiblemente el camino a seguir.

El líder de especificaciones JSR-310 es Stephen Colebourne, quien escribió JODA en primer lugar, por lo que reemplazará lógicamente a JODA.


16
No debe ser reinventado por no especialistas, la OMI.
Jon Skeet

66
Tampoco soy un imbécil, pero todavía he tenido problemas con las API de Java D&T. Son dolorosamente fáciles de usar mal. La razón por la cual es más probable que las personas puedan usar Joda de manera adecuada es que Joda está mejor diseñada: lo alienta a hacer lo correcto.
Jon Skeet

66
Confío en un experto sobre mí cualquier día de la semana en lo que respecta a las API de fecha / hora. No es que sea una API aleatoria de terceros sin que nadie más la use. El argumento "> 100 clases" es un hombre de paja, porque obviamente no necesitas aprenderlos todos.
Jon Skeet

55
Supongo que tendremos que aceptar diferir. Cualquier fecha / hora confiable escrita por expertos y bien diseñada, que evite que tenga que hacer un trabajo sucio con el cálculo del tiempo, cuenta como un "must have" desde mi punto de vista. Durante el último año aprendí a odiar la medición del tiempo humano con pasión.
Jon Skeet

55
Rodar el tuyo cuando Joda existe es una idea simplemente terrible. Solo no lo hagas. Es cierto que Joda tiene docenas de clases que no vas a usar, pero la respuesta a esto es muy simple: no uses las que no necesitas. Hay tantas cosas que pueden salir mal al escribir su propia biblioteca de este tipo: la cantidad de esfuerzo que tendrá que realizar es enorme, tanto en desarrollo como en pruebas. O simplemente puede agregar una biblioteca. Entonces, Joda tiene el beneficio adicional de que los nuevos reclutas de su equipo pueden haberlo usado antes, pero no habrán usado su biblioteca local.
Dawood ibn Kareem

7

Todo depende de lo que esté haciendo con las fechas. Si simplemente las persiste, las fechas integradas en Java probablemente harán todo lo que desee. Sin embargo, si está haciendo una extensa manipulación de fecha y hora, probablemente sea mejor con Joda.


7

Deberías usar una biblioteca Joda-Time, porque:

  1. Joda-Time es compatible con el estándar ISO 8601 , que es una forma estándar de
    representación de fecha.
  2. Sumar y restar un día / mes / año es más fácil en Joda-Time que java.util.date.
  3. Una inicialización por una fecha de entrega es mucho más fácil en Joda-Time.
  4. Joda-Time también es compatible con la zona horaria.
  5. Joda-Time tiene un mejor análisis incorporado. Se arroja una fecha incorrecta como "2014-02-31" como un error:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Puede que le guste esta página para obtener más detalles: http://swcodes.blogspot.com/

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.