Joda Time vs Java Time

19

Aunque Joda tiene muchas funciones y es más sofisticado que el tiempo estándar de Java, puede que no siempre sea lo mejor. ¿Cómo decido si debo usar Joda Time o Java Time en algún código Java?

¿Existe algún tipo de directriz que nos indique cómo elegir la correcta según nuestros requisitos?

Caballero Jedi
fuente
55
Obtenga lo mejor de ambos mundos, utilizando la nueva API de fecha y hora incluida en Java 8 . Está fuertemente influenciado por Joda Time. De hecho, el autor principal es Stephen Colebourne, el autor de Joda Time.
Joachim Sauer
1
@JoachimSauer ¿Ha aparecido en una versión final o esto sucederá cuando se lance Java 8?
m3th0dman
@ m3th0dman: se incluirá en la versión final de Java 8, aún no se ha lanzado. GA está actualmente programado para el 09/09/2013 .
Joachim Sauer
Joda-Time y las clases originales de fecha y hora de Java ahora están pasadas de moda por las clases java.time integradas en Java 8, Java 9 y versiones posteriores.
Basil Bourque

Respuestas:

29

Joda Time es una mejora tan grande sobre la biblioteca de tiempo de Java que casi siempre es la elección correcta, aparte de las siguientes excepciones:

  1. Cuando es difícil o indeseable agregar dependencias de terceros a su proyecto

  2. Cuando su uso en una interfaz pública causaría problemas, por ejemplo, obtener un ORM para manejar los campos de tiempo de Java y Joda

Sin embargo, en el caso de 2) aún sería mejor usar Joda internamente si es posible.

Vale la pena tener en cuenta lo anterior, pero debería ser raro. En caso de duda, ve con Joda.

Robert Johnson
fuente
Por favor, dime qué significa "usar Joda internamente". Soy un principiante y no sé todas estas cosas.
Caballero Jedi
55
@Jedi Knight: significa que la aplicación usa Joda para su propia lógica y solo convierte a / desde java.util.Date cuando se comunica con un sistema externo que lo requiere.
Michael Borgwardt
2
Por 'interno', podría ser interno a la aplicación en su conjunto (como en el ejemplo de Michael), pero podría ser interno a una clase o simplemente a un método en particular. Digamos, por ejemplo, que tiene un método de utilidad que toma dos objetos Java Date y calcula la cantidad de días hábiles entre ellos, pero contiene un error. Para solucionarlo, puede ser más fácil reescribir ese método usando JodaTime en su lugar, pero es posible que no pueda darse el tiempo para refactorizar todo el código que llama al método, por lo que deja la firma del método sin cambios. En este caso, estás usando Joda "internamente" en ese método.
Robert Johnson
Para su información, el proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo aconseja migrar a las clases java.time . Ver Tutorial de Oracle .
Basil Bourque
13

Tenga en cuenta que en el sitio web Joda-Time dice:

Las clases estándar de fecha y hora anteriores a Java SE 8 son deficientes. Al abordar este problema de frente, Joda-Time se ha convertido en la biblioteca de fecha y hora estándar de facto para Java. Tenga en cuenta que a partir de Java SE 8 en adelante, los usuarios deben migrar a java.time (JSR-310).

El principal contribuyente a Joda-Time , jodastephen , también es el principal contribuyente para JSR-310, como se puede ver en el repositorio de GitHub asociado con http://www.threeten.org/ . Por cierto, jodastephen también tiene un manejo SO ...

Creo que es seguro afirmar que podemos sentirnos cómodos y seguros con la nueva API de fecha y hora que se proporciona en Java 8 en adelante.

Algunas referencias adicionales:

Yoyó
fuente
12

La API de fecha estándar de Java está tan fundamentalmente rota que a menudo he considerado simplemente agregar Joda Time a las extensiones de la biblioteca de JVM para que se cargue en el classpath de forma predeterminada con el resto de la API de Java.

Si alguna vez se le ha asignado la tarea de actualizar la internacionalización y las zonas horarias en una aplicación Java heredada y ha intentado utilizar solo la API Java estándar, comprenderá lo que quiero decir. Pude convertir miles de líneas de código estúpidas en menos de cien. El aumento de la productividad es inconcebible.

Además, la API de fecha estándar no es intuitiva, donde la API de Joda fluida se puede recoger en horas, no en semanas. Su analogía de tratar de llegar a la isla que está a dos millas de distancia es más parecida a la siguiente.

1) Una lancha que lo llevará a la isla en solo 6 minutos.

O...

2) Una improvisada balsa de bambú atada con vides durante un huracán dirigido por un loco cuyo mejor amigo es el voleibol.

Como han dicho otras respuestas, los pocos inconvenientes, como el ORM, incluso se están volviendo inexistentes, ya que Hibernate ahora tiene complementos que permiten que las propiedades del bean tipo Joda se asignen a los campos de fecha / hora de la base de datos. JPA también podría tener una respuesta para esto también.

Si su deseo es que su aplicación tenga una huella minimalista como una aplicación de escritorio en lo que respecta al espacio en disco, entonces quizás Java ni siquiera sea la opción de idioma correcta.

árbol de arce
fuente
Para su información, el proyecto Joda-Time ahora está en modo de mantenimiento , y el equipo aconseja migrar a las clases java.time . Ver Tutorial de Oracle .
Basil Bourque
8

Un punto más: Java-Time (es decir Date) no es ThreadSafe pero JodaTime sí. Por lo tanto, se prefiere JodaTime cuando los requisitos como

  • Entorno multihilo que accede a los recursos comunes
  • Sincronización de tiempo centralizada como situaciones

O bien, para aplicaciones simples, Java-Time está bien.

vintesh
fuente
Incluso DateTime tampoco es ThreadSafe, ¿no? Corrígeme si me estoy yendo mal.
Vintesh
3
La gran mayoría de la biblioteca Joda, incluida la clase DateTime, es inmutable y, por lo tanto, segura para subprocesos. Sin embargo, hay algunas clases mutables que no son seguras para subprocesos. Ver joda-time.sourceforge.net/faq.html#threading .
Robert Johnson
1
La seguridad de subprocesos java.timese implementa mediante la inmutabilidad. Ver stackoverflow.com/questions/9303532/… . Esto funciona bien para aplicaciones simples y complejas. Incluso el api doc afirma que "Todas las clases son inmutables y seguras para subprocesos" (literalmente citado en el segundo párrafo). Las viejas java.utilclases, por otro lado, tienen varios problemas. Me doy cuenta de que esta respuesta se refiere a la última, pero es importante hacer esa distinción ahora.
YoYo
No representar las fechas como valores inmutables es una locura. Sé que se ha solucionado ahora, pero ¿qué pensaban realmente en el mundo?
Aluan Haddad
2

El marco java.time reemplaza tanto las clases de fecha y hora heredadas como Joda-Time

Actualización: las antiguas clases de fecha y hora incluidas con las primeras versiones de Java ahora son heredadas, suplantadas oficialmente por las clases java.time integradas en Java 8, Java 9 y versiones posteriores.

Date, Calendar, SimpleDateFormat, Y las java.sql.*clases de fecha y hora todos deben ser evitados. Nunca es necesario usar estas clases confusas, problemáticas y mal diseñadas. Están completamente reemplazados por clases java.time. Su único propósito ahora es mantener el código antiguo existente. Al interactuar con el código antiguo, puede convertir a / desde java.time llamando a nuevos métodos agregados a las clases antiguas. Para obtener más información sobre la conversión, consulte: Convertir java.util.Date a qué tipo de "java.time"? .

El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time . El proyecto Joda-Time inspiró el marco java.time. Ambos están dirigidos por el mismo hombre, Stephen Colebourne . Puede pensar en java.time como una reescritura / rediseño de Joda-Time, todo código nuevo pero utilizando lo aprendido a lo largo de los años al construir la primera biblioteca de fecha y hora completa y sofisticada de la industria.

Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.

Gran parte de la funcionalidad java.time se transfiere a Java 6 y 7 en ThreeTen-Backport y se adapta aún más a Android en ThreeTenABP (consulte Cómo usar ... ).

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más .

Albahaca Bourque
fuente