¿Cuál es la mejor manera de manipular fechas y marcas de tiempo en Java?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Cada vez que necesito trabajar con fechas y/o marcas de tiempo en Java, siempre siento que estoy haciendo algo mal y paso horas interminables tratando de encontrar una mejor manera de trabajar con las API sin tener que codificar mis propias clases de utilidad de Fecha y Hora. .Aquí hay un par de cosas molestas con las que me acabo de encontrar:

  • Meses basados ​​en 0.Me doy cuenta de que la mejor práctica es usar Calendar.SEPTEMBER en lugar del 8, pero es molesto que el 8 represente septiembre y no agosto.

  • Obtener una fecha sin marca de tiempo.Siempre necesito la utilidad que pone a cero la parte de la marca de tiempo de la fecha.

  • Sé que he tenido otros problemas en el pasado, pero no los recuerdo.Siéntase libre de agregar más en sus respuestas.

Entonces mi pregunta es...¿Qué API de terceros utiliza para simplificar el uso de Java de la manipulación de fecha y hora, si corresponde?¿Alguna idea sobre el uso? joda?¿Alguien miró más de cerca la API de fecha y hora JSR-310?

¿Fue útil?

Solución

Esta publicación tiene una buena discusión sobre la comparación de la API de fecha/hora de Java con JODA.

Yo personalmente solo uso Calendario Gregoriano y Formato de fecha simple cada vez que necesito manipular fechas/horas en Java.Realmente nunca he tenido problemas al usar la API de Java y la encuentro bastante fácil de usar, por lo que no he buscado ninguna alternativa.

Otros consejos

java.tiempo

Java 8 y posteriores ahora incluyen el java.tiempo estructura.Inspirado por Tiempo Joda, definido por JSR 310, ampliado por el TresDiez-Extra proyecto.Ver el tutorial.

Este marco reemplaza las antiguas clases java.util.Date/.Calendar.Los métodos de conversión le permiten convertir de un lado a otro para trabajar con código antiguo que aún no se ha actualizado para los tipos java.time.

Las clases básicas son:

Este marco resuelve el par de problemas que enumeró.

meses basados ​​en 0

Los números de los meses son del 1 al 12 en java.time.

Aún mejor, un Enum (Month) proporciona una instancia de objeto para cada mes del año.Por lo tanto, no necesita depender de números "mágicos" en su código como 9 o 10.

if ( theMonth.equals ( Month.OCTOBER ) ) {  …

Además, esa enumeración incluye algunos métodos de utilidad útiles, como obtener el nombre localizado de un mes.

Si aún no está familiarizado con las enumeraciones de Java, lea el Tutorial y estudiar.Son sorprendentemente útiles y poderosos.

Una cita sin tiempo

El LocalDate La clase representa un valor de solo fecha, sin hora del día, sin zona horaria.

LocalDate localDate = LocalDate.parse( "2015-01-02" );

Tenga en cuenta que para determinar una fecha se requiere una zona horaria.Un nuevo día amanece más temprano en París que en Montreal, donde todavía es “ayer”.El ZoneId La clase representa una zona horaria.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

Del mismo modo, existe una LocalTime clase para una hora del día que aún no está vinculada a una fecha o zona horaria.


Acerca de java.time

El java.tiempo framework está integrado en Java 8 y versiones posteriores.Estas clases reemplazan a las viejas y problemáticas legado clases de fecha y hora como java.util.Date, Calendar, & SimpleDateFormat.

El Tiempo Joda proyecto, ahora en modo de mantenimiento, aconseja la migración a la java.tiempo clases.

Para obtener más información, consulte el Tutorial de Oráculo.Y busque Stack Overflow para obtener muchos ejemplos y explicaciones.La especificación es JSR 310.

¿Dónde obtener las clases java.time?

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

El proyecto Apache Commons Lang tiene un DateUtils clase que realiza operaciones de fecha útiles.

yo suelo DateUtils.truncate() mucho, lo que "pondrá a cero" partes de la Fecha (útil si desea que su objeto Fecha, por ejemplo, represente una fecha y no incluya ninguna información de tiempo).Cada método funciona para ambos. Date y Calendar objetos también.

http://commons.apache.org/lang/

He estado usando Joda exclusivamente durante tres años y definitivamente lo recomendaría: tiene toda el área cubierta con una interfaz que "hace lo que dice".

Joda puede parecer complejo cuando comienzas, ya que, por ejemplo, tiene conceptos de períodos, duración e intervalos que parecen similares, pero puedes comenzar simplemente sustituyendo org.joda.time.DateTime (o org.joda.time.DateMidnight) para java.util.Date en su código y apegarse a los muchos métodos útiles que contienen esas clases, antes de comprender las otras áreas.

Estoy usando GregorianCalendar, siempre y en todas partes.Java.util.Date simple es demasiado complejo, sí.

Entonces, mi consejo es: use GC, es simple

Es lo mismo en javascript.Alguien debe haber estado fumando algo cuando piensa que es una buena idea decir que 2008 significa el año 2008, 31 significa el día 31 del mes y, esta es la mejor parte, 11 significa el mes 12.

Por otro lado, acertaron en dos de cada tres.

Lo que siempre me molesta con Java es la biblioteca de fecha y hora.Nunca he usado Joda, solo mírelo brevemente, parece que es una implementación bastante buena, y si entiendo JSR-130 correctamente, tomará conocimiento de Joda y eventualmente lo incluirá en JavaSE.

Muy a menudo, en proyectos anteriores, envolví los objetos de fecha y hora de Java, lo que en sí mismo fue toda una tarea.Luego usé los envoltorios para la manipulación de fechas.

Las API de fechas son muy difíciles de diseñar, especialmente si tienen que lidiar con la localización.Intenta hacer el tuyo propio y verás que vale la pena hacerlo al menos una vez.El hecho de que Joda haya podido hacer un trabajo tan bueno es un verdadero mérito para sus desarrolladores.Para responder a su pregunta, no he oído más que cosas buenas sobre esa biblioteca, aunque nunca he jugado con ella.

Muchos programadores comienzan usando Date, que tiene numerosos constructores sobrecargados y obsoletos (lo que dificulta su uso), pero una vez que descubres GregorianCalendar, se vuelve un poco más fácil de administrar.El ejemplo aquí es bastante útil:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html

Es realmente sencillo escribir su propia API de fecha que se ubica encima de las clases sin formato de Java, Fecha y Calendario.Básicamente, tanto la fecha como el Calendario sufren por el hecho de que intentan agrupar dos conceptos en una clase:

  1. Fecha (es decir,Año mes dia)
  2. Instantáneo (es decir,horaactualMillis)

Cuando comprenda esto, revolucionará la forma en que maneja conceptos similares a fechas en su código.Las cosas serán más simples, más claras y mejores.¡En todo sentido!

Para mí, Joda es demasiado complicado, al menos para la inmensa mayoría de los propósitos y particularmente no me gusta el hecho de que hayan ido en contra de los formularios estándar de Java, un ejemplo es cómo analizan y dan formato a las fechas.Stephen Colebourne, la persona detrás de JODA, es el líder de especificaciones de JSR-310 y, en mi humilde opinión, sufre los mismos problemas (he seguido y contribuido a las discusiones durante los últimos años).

Hazlo tu mismo;es fácil.Simplemente complete las siguientes clases:MyDate (enumeración año-mes-día), Mes (una enumeración), TimeOfDay (hora-min-seg-millis), DayOfWeek (enumeración), Instant (enumeración larga).Considere siempre las zonas horarias al realizar conversiones entre instantes y fechas.

Si esto parece desalentador, puedes usar Calendar y SimpleDateFormat bajo el capó.Harás esto en un día y nunca te arrepentirás.

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